Biorąc pod uwagę ścieżkę, na przykład: "mydir/myfile.txt"
jak znaleźć bezwzględną ścieżkę pliku względem bieżącego katalogu roboczego w Pythonie? Np. W systemie Windows mogę skończyć z:
"C:/example/cwd/mydir/myfile.txt"
Biorąc pod uwagę ścieżkę, na przykład: "mydir/myfile.txt"
jak znaleźć bezwzględną ścieżkę pliku względem bieżącego katalogu roboczego w Pythonie? Np. W systemie Windows mogę skończyć z:
"C:/example/cwd/mydir/myfile.txt"
Odpowiedzi:
Działa również, jeśli jest to już ścieżka bezwzględna:
źródło
normpath()
w następujący sposób:normpath(join(os.getcwd(), path))
. Więc jeślimydir/myfile.txt
nieos.getcwd()
, to ścieżka absolutna nie jest prawdziwą ścieżką .mydir/myfile.txt
domyślnie odnosi się do ścieżki w bieżącym katalogu roboczym, ponieważ jest to odpowiednik./mydir/myfile.txt
. Być może nie jest to ścieżka, którą zamierzałeś wprowadzić, ale wydaje mi się, że o ile wiem, to poprawna interpretacja ścieżki. Czy mógłbyś opracować?abspath
funkcji a prawdziwym plikiem. Możesz podać dowolne nieistniejące pliki ścieżki i heirarchie katalogów są w porządku - i abspath po prostu rozpozna bitów ścieżki (włączając element katalogu nadrzędnego..
) i zwróci ciąg. To tylko ciąg obliczony z bieżącego katalogu; jak się wydaje, jakakolwiek korelacja z rzeczywistym plikiem jest przypadkowa. Spróbowaćos.path.abspath("/wow/junk/../blha/hooey")
. To działa.os.path.exists
. Przeciwnie, systemy takie jak PowerShell, które nalegają na ścieżkę istniejącą ze standardową funkcją rozdzielczości ścieżki, są uciążliwe w użyciu.relpath
path
relpath
Możesz użyć nowej biblioteki Python 3.4
pathlib
. (Można go również uzyskać w języku Python 2.6 lub 2.7pip install pathlib
.) Autorzy napisali : „Celem tej biblioteki jest zapewnienie prostej hierarchii klas do obsługi ścieżek systemu plików i typowych operacji wykonywanych przez użytkowników”.Aby uzyskać bezwzględną ścieżkę w systemie Windows:
Lub w systemie UNIX:
Dokumenty są tutaj: https://docs.python.org/3/library/pathlib.html
źródło
os.path.abspath()
dało mi błąd:AttributeError: 'NoneType' object has no attribute 'startswith'
użyciePath().resolve()
nie ma tej samej względnej ścieżki do pliku. (Linux i Python3.4)Co więcej, zainstaluj moduł (znaleziony na
PyPI
), otacza wszystkieos.path
funkcje i inne powiązane funkcje w metody na obiekcie, z którego można korzystać wszędzie tam, gdzie używane są łańcuchy:źródło
pathlib
. Zobacz moją odpowiedź w tym wątku.from path import Path
następniePath('mydir/myfile.txt').abspath()
path
modułu. Połączony moduł używa klasy o nazwiepath
.Dziś możesz również skorzystać z
unipath
pakietu opartego napath.py
: http://sluggo.scrapping.cc/python/unipath/Polecam użycie tego pakietu, ponieważ oferuje on czysty interfejs do popularnych narzędzi os.path .
źródło
Aktualizacja dla Python 3.4+,
pathlib
która faktycznie odpowiada na pytanie:Jeśli potrzebujesz tylko tymczasowego ciągu znaków, pamiętaj, że możesz używać
Path
obiektów ze wszystkimi odpowiednimi funkcjami, wos.path
tym oczywiścieabspath
:źródło
Zauważ, że
expanduser
jest to konieczne (w systemie Unix) w przypadku, gdy podane wyrażenie nazwy pliku (lub katalogu) może zawierać wiodące~/
(tylda odnosi się do katalogu domowego użytkownika) iexpandvars
zajmuje się wszelkimi innymi zmiennymi środowiskowymi (jak$HOME
).źródło
To zawsze otrzymuje poprawną nazwę pliku bieżącego skryptu, nawet jeśli jest wywoływany z innego skryptu. Jest to szczególnie przydatne podczas korzystania
subprocess
.stamtąd możesz uzyskać pełną ścieżkę skryptu za pomocą:
Ułatwia także nawigację po folderach, dodając
/..
tyle razy, ile chcesz, aby przejść w górę w hierarchii katalogów.Aby uzyskać cwd:
Dla ścieżki nadrzędnej:
Łącząc się
"/.."
z innymi nazwami plików, możesz uzyskać dostęp do dowolnego pliku w systemie.źródło
Moduł
os
zapewnia sposób na znalezienie ścieżki abs.ALE większość ścieżek w Linuksie zaczyna się od
~
(tylda), co nie daje zadowalającego wyniku.więc możesz użyć
srblib
do tego.zainstaluj za pomocą
python3 -m pip install srblib
https://pypi.org/project/srblib/
źródło
Wolę używać glob
oto jak wyświetlić listę wszystkich typów plików w bieżącym folderze:
oto jak wyświetlić listę wszystkich (na przykład) plików .txt w bieżącym folderze:
oto jak wyświetlić listę wszystkich typów plików w wybranym katalogu:
mam nadzieję, że to ci pomogło
źródło
os.path.abspath()
) do dowolnej ścieżki względnejglob
przewidzianej dla twoich pierwszych dwóch przypadków ...jeśli jesteś na komputerze Mac
da ci to pełną ścieżkę:
pokaże następującą ścieżkę:
źródło
W przypadku, gdy ktoś używa Pythona i Linuksa i szuka pełnej ścieżki do pliku:
źródło