Odpowiedzi:
>>> import os
>>> os.path.abspath("mydir/myfile.txt")
'C:/example/cwd/mydir/myfile.txt'
Działa również, jeśli jest to już ścieżka bezwzględna:
>>> import os
>>> os.path.abspath("C:/example/cwd/mydir/myfile.txt")
'C:/example/cwd/mydir/myfile.txt'
normpath()
w następujący sposób: normpath(join(os.getcwd(), path))
. Więc jeśli mydir/myfile.txt
nie os.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.7 pip 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:
>>> from pathlib import Path
>>> p = Path("pythonw.exe").resolve()
>>> p
WindowsPath('C:/Python27/pythonw.exe')
>>> str(p)
'C:\\Python27\\pythonw.exe'
Lub w systemie UNIX:
>>> from pathlib import Path
>>> p = Path("python3.4").resolve()
>>> p
PosixPath('/opt/python3/bin/python3.4')
>>> str(p)
'/opt/python3/bin/python3.4'
Dokumenty są tutaj: https://docs.python.org/3/library/pathlib.html
os.path.abspath()
dało mi błąd: AttributeError: 'NoneType' object has no attribute 'startswith'
użycie Path().resolve()
nie ma tej samej względnej ścieżki do pliku. (Linux i Python3.4)
Co więcej, zainstaluj moduł (znaleziony na PyPI
), otacza wszystkie os.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:
>>> from path import path
>>> path('mydir/myfile.txt').abspath()
'C:\\example\\cwd\\mydir\\myfile.txt'
>>>
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 nazwie path
.
Dziś możesz również skorzystać z unipath
pakietu opartego na path.py
: http://sluggo.scrapping.cc/python/unipath/
>>> from unipath import Path
>>> absolute_path = Path('mydir/myfile.txt').absolute()
Path('C:\\example\\cwd\\mydir\\myfile.txt')
>>> str(absolute_path)
C:\\example\\cwd\\mydir\\myfile.txt
>>>
Polecam użycie tego pakietu, ponieważ oferuje on czysty interfejs do popularnych narzędzi os.path .
Aktualizacja dla Python 3.4+, pathlib
która faktycznie odpowiada na pytanie:
from pathlib import Path
relative = Path("mydir/myfile.txt")
absolute = relative.absolute() # absolute is a Path object
Jeśli potrzebujesz tylko tymczasowego ciągu znaków, pamiętaj, że możesz używać Path
obiektów ze wszystkimi odpowiednimi funkcjami, w os.path
tym oczywiście abspath
:
from os.path import abspath
absolute = abspath(relative) # absolute is a str object
import os
os.path.abspath(os.path.expanduser(os.path.expandvars(PathNameString)))
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) i expandvars
zajmuje się wszelkimi innymi zmiennymi środowiskowymi (jak $HOME
).
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
.
import sys,os
filename = sys.argv[0]
stamtąd możesz uzyskać pełną ścieżkę skryptu za pomocą:
>>> os.path.abspath(filename)
'/foo/bar/script.py'
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:
>>> os.path.abspath(filename+"/..")
'/foo/bar'
Dla ścieżki nadrzędnej:
>>> os.path.abspath(filename+"/../..")
'/foo'
Łącząc się "/.."
z innymi nazwami plików, możesz uzyskać dostęp do dowolnego pliku w systemie.
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.
>>> import os
>>> os.path.abspath('~/hello/world')
'/home/srb/Desktop/~/hello/world'
>>> from srblib import abs_path
>>> abs_path('~/hello/world')
'/home/srb/hello/world'
zainstaluj za pomocą python3 -m pip install srblib
Wolę używać glob
oto jak wyświetlić listę wszystkich typów plików w bieżącym folderze:
import glob
for x in glob.glob():
print(x)
oto jak wyświetlić listę wszystkich (na przykład) plików .txt w bieżącym folderze:
import glob
for x in glob.glob('*.txt'):
print(x)
oto jak wyświetlić listę wszystkich typów plików w wybranym katalogu:
import glob
for x in glob.glob('C:/example/hi/hello/'):
print(x)
mam nadzieję, że to ci pomogło
os.path.abspath()
) do dowolnej ścieżki względnej glob
przewidzianej dla twoich pierwszych dwóch przypadków ...
jeśli jesteś na komputerze Mac
import os
upload_folder = os.path.abspath("static/img/users")
da ci to pełną ścieżkę:
print(upload_folder)
pokaże następującą ścieżkę:
>>>/Users/myUsername/PycharmProjects/OBS/static/img/user