Znajdź bieżący katalog i Katalog pliku [duplikat]
W Pythonie, jakich poleceń mogę użyć, aby znaleźć:
- bieżący katalog (w którym byłem w terminalu, gdy uruchomiłem skrypt Pythona), oraz
- gdzie plik, który wykonuję to?
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:
- The
os
orazos.path
Moduły. - The
__file__
stała -
os.path.realpath(path)
(zwraca "kanoniczną ścieżkę podanej nazwy pliku, eliminując wszelkie dowiązania symboliczne napotkane w ścieżce") -
os.path.dirname(path)
(zwraca " nazwę katalogu pathnamepath
") -
os.getcwd()
(zwraca " łańcuch reprezentujący bieżącą pracę katalog") -
os.chdir(path)
("Zmień bieżący katalog roboczy napath
")
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?
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))
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
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"
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__))
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 .
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
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('.')
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__)
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())
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ę.
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).
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