Znajdź bieżący katalog i Katalog pliku [duplikat]

to pytanie ma już odpowiedzi tutaj : Jak poprawnie określić bieżący katalog skryptów w Pythonie? (13 Odpowiedzi) Jak poznać / zmienić bieżący katalog w powłoce Pythona? (7 odpowiedzi) Zamknięty 3 lata temu .

W Pythonie, jakich poleceń mogę użyć, aby znaleźć:

  1. bieżący katalog (w którym byłem w terminalu, gdy uruchomiłem skrypt Pythona), oraz
  2. gdzie plik, który wykonuję to?
Author: Mark Amery, 2011-02-28

13 answers

Aby uzyskać pełną ścieżkę do katalogu, w którym znajduje się plik Pythona, zapisz to w tym pliku:

import os 
dir_path = os.path.dirname(os.path.realpath(__file__))

(zauważ, że powyższa inkantacja nie zadziała, jeśli użyłeś już os.chdir() do zmiany bieżącego katalogu roboczego, ponieważ wartość stałej __file__ jest względna do bieżącego katalogu roboczego i nie jest zmieniana przez wywołanie os.chdir().)


Aby uzyskać bieżący katalog roboczy użyj

import os
cwd = os.getcwd()

Odniesienia do dokumentacji dla modułów, stałych oraz funkcje użyte powyżej:

 3777
Author: Russell Dias,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-31 12:34:02

Bieżący Katalog Roboczy: os.getcwd()

I __file__ atrybut może pomóc ci dowiedzieć się, gdzie znajduje się plik, który wykonujesz. Ten post wyjaśnia wszystko: Jak uzyskać ścieżkę bieżącego wykonanego pliku w Pythonie?

 332
Author: Nix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-10 00:30:14

Może okazać się to przydatne jako odniesienie:

import os

print("Path at terminal when executing this file")
print(os.getcwd() + "\n")

print("This file path, relative to os.getcwd()")
print(__file__ + "\n")

print("This file full path (following symlinks)")
full_path = os.path.realpath(__file__)
print(full_path + "\n")

print("This file directory and name")
path, filename = os.path.split(full_path)
print(path + ' --> ' + filename + "\n")

print("This file directory only")
print(os.path.dirname(full_path))
 298
Author: Daniel Reis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-13 14:16:53

pathlib moduł, wprowadzony w Pythonie 3.4 (PEP 428-moduł pathlib - obiektowe ścieżki systemu plików ), sprawia, że doświadczenie związane ze ścieżkami jest znacznie lepsze.

$ pwd
/home/skovorodkin/stack
$ tree
.
└── scripts
    ├── 1.py
    └── 2.py

Aby uzyskać bieżący katalog roboczy użyj Path.cwd():

from pathlib import Path

print(Path.cwd())  # /home/skovorodkin/stack

Aby uzyskać bezwzględną ścieżkę do pliku skryptu, użyj Path.resolve() "metoda": {]}

print(Path(__file__).resolve())  # /home/skovorodkin/stack/scripts/1.py

I aby uzyskać ścieżkę katalogu, w którym znajduje się twój skrypt, uzyskaj dostęp .parent (on zaleca się zadzwonić .resolve() przed .parent):

print(Path(__file__).resolve().parent)  # /home/skovorodkin/stack/scripts

Pamiętaj, że {[12] } nie jest wiarygodne w niektórych sytuacjach: Jak uzyskać ścieżkę bieżącego wykonanego pliku w Pythonie?.


Należy pamiętać, że Path.cwd(), Path.resolve() i inne metody Path zwracają obiekty ścieżki (PosixPath w moim przypadku), a nie struny. W Pythonie 3.4 i 3.5 powodowało to pewien ból, ponieważ open wbudowana funkcja mogła działać tylko z obiektami string lub bajtów i nie obsługiwała Path obiektów, więc trzeba było przekonwertować Path obiekty na łańcuchy lub użyć Path.open() metoda, ale ta druga opcja wymagała zmiany starego kodu:

$ cat scripts/2.py
from pathlib import Path

p = Path(__file__).resolve()

with p.open() as f: pass
with open(str(p)) as f: pass
with open(p) as f: pass

print('OK')

$ python3.5 scripts/2.py
Traceback (most recent call last):
  File "scripts/2.py", line 11, in <module>
    with open(p) as f:
TypeError: invalid file: PosixPath('/home/skovorodkin/stack/scripts/2.py')

Jak widać open(p) nie działa z Pythonem 3.5.

PEP 519-dodanie protokołu ścieżki systemu plików , zaimplementowanego w Pythonie 3.6, dodaje obsługę PathLike obiekty do open funkcja, więc teraz możesz przekazać Path obiekty do open bezpośrednio:

$ python3.6 scripts/2.py
OK
 140
Author: skovorodkin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-17 20:02:39

1.To Pobierz pełną ścieżkę bieżącego katalogu

    >>import os
    >>print os.getcwd()

O / P: "C: \Users \ admin \ myfolder"

1.To pobranie samej nazwy bieżącego katalogu

    >>import os
    >>str1=os.getcwd()
    >>str2=str1.split('\\')
    >>n=len(str2)
    >>print str2[n-1]

O / P: "myfolder"

 60
Author: vinithravit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-24 07:00:16

Jeśli próbujesz znaleźć bieżący katalog pliku, w którym aktualnie się znajdujesz:

OS agnostyczny sposób:

dirname, filename = os.path.split(os.path.abspath(__file__))
 40
Author: Kurt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-07 21:10:18

Jeśli używasz Pythona 3.4, istnieje zupełnie nowy moduł wyższego poziomu pathlib, który pozwala na wygodne wywołanie pathlib.Path.cwd(), Aby uzyskać obiekt Path reprezentujący bieżący katalog roboczy, wraz z wieloma innymi nowymi funkcjami.

Więcej informacji na temat tego nowego API można znaleźć tutaj .

 34
Author: Jazzer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-23 15:12:21

Pathlib można użyć w ten sposób, aby uzyskać katalog zawierający bieżący skrypt:

import pathlib
filepath = pathlib.Path(__file__).resolve().parent
 30
Author: Mathieu C.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-29 13:07:54

Aby uzyskać pełną ścieżkę do bieżącego katalogu:

os.path.realpath('.')
 30
Author: Ilia S.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-29 20:12:38

Odpowiedź na #1:

Jeśli chcesz mieć bieżący katalog, zrób to:

import os
os.getcwd()

Jeśli chcesz tylko nazwę folderu i masz ścieżkę do tego folderu, zrób to:

def get_folder_name(folder):
    '''
    Returns the folder name, given a full folder path
    '''
    return folder.split(os.sep)[-1]

Odpowiedź na #2:

import os
print os.path.abspath(__file__)
 29
Author: Blairg23,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-15 00:08:10

Trochę za późno na imprezę, ale myślę, że najbardziej zwięzłym sposobem na znalezienie tylko nazwy obecnego kontekstu egzekucji byłoby

current_folder_path, current_folder_name = os.path.split(os.getcwd())
 28
Author: StormShadow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-09 10:31:39

Jeśli szukasz lokalizacji aktualnie wykonywanego skryptu, możesz użyć sys.argv[0], aby uzyskać pełną ścieżkę.

 18
Author: Grochni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-18 03:03:11

Dla pytania 1 Użyj os.getcwd() # get working dir i os.chdir(r'D:\Steam\steamapps\common') # set working dir


Zalecam użycie sys.argv[0] w pytaniu 2, Ponieważ sys.argv jest niezmienny i dlatego zawsze zwraca bieżący plik (ścieżkę obiektu modułu) i nie ma na niego wpływu os.chdir(). Również możesz zrobić tak:

import os
this_py_file = os.path.realpath(__file__)

# vvv Below comes your code vvv #

Ale ten fragment i sys.argv[0] nie będzie działał lub będzie działał wierd po skompilowaniu przez PyInstaller, ponieważ właściwości magiczne nie są ustawione na poziomie __main__ i sys.argv[0] jest to sposób, w jaki twój exe został wywołany (oznacza, że wpływa na to działanie dir).

 9
Author: Kotauskas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-20 05:46:46