Ok ... nie wiem, gdzie x
jest moduł , ale wiem, że muszę uzyskać ścieżkę do katalogu dwa poziomy wyżej.
Czy jest więc bardziej elegancki sposób:
import os
two_up = os.path.dirname(os.path.dirname(__file__))
Mile widziane rozwiązania dla Pythona 2 i 3!
pathlib
Rozwiązanie jest trochę ładniejszy i bardziej czytelne, ale nie jest wliczone w Pythonie 2.7. Powiedziałbym, że trzymaj się tego, co masz, może dodaj komentarz.pip install pathlib2
opcję utrzymania rozsądku w 2.7.Odpowiedzi:
Możesz użyć
pathlib
. Niestety jest to dostępne tylko w standardowej bibliotece Python 3.4. Jeśli masz starszą wersję, musisz zainstalować kopię z PyPI tutaj . Powinno to być łatwe do zrobienia za pomocąpip
.from pathlib import Path p = Path(__file__).parents[1] print(p) # /absolute/path/to/two/levels/up
Używa
parents
sekwencji, która zapewnia dostęp do katalogów nadrzędnych i wybiera drugi w górę.Zauważ, że
p
w tym przypadku będzie jakaś formaPath
obiektu z własnymi metodami. Jeśli potrzebujesz ścieżek jako łańcuchów, możesz je wywołaćstr
.źródło
Path
klasaparents
zależy od miejsca wykonania. Jeśli wykonasz swój plik__file__
z bieżącego katalogu,Path
klasa nie będzie miała rodziców. Albo odpowiedź @ Sebi2020 powinna zostać zaakceptowana, albo powinna zostać użyta Twoja oryginalna metoda. Uważam, że twoja oryginalna metoda jest bardziej czytelna.p = Path(os.path.abspath(__file__)).parents[1]
os.path.abspath
, możesz też użyćPath(__file__).resolve().parents[1]
p = Path(__file__).resolve().parents[1]
. Dodałem to również jako odpowiedź.Bardzo łatwe:
Oto, czego chcesz:
import os.path as path two_up = path.abspath(path.join(__file__ ,"../.."))
źródło
os.pardir
raczej użyj niż..
.__file__
.Chciałem to dodać, żeby być głupim, ale także dlatego, że pokazuje nowicjuszom potencjalną użyteczność funkcji aliasingu i / lub importu.
Po napisaniu tego uważam, że ten kod jest bardziej czytelny (tj. Krótszy czas na zrozumienie intencji) niż inne dotychczasowe odpowiedzi, a czytelność jest (zwykle) najważniejsza.
from os.path import dirname as up two_up = up(up(__file__))
Uwaga: chcesz to zrobić tylko wtedy, gdy twój moduł jest bardzo mały lub spójny kontekstowo.
źródło
Najlepszym rozwiązaniem (dla pythona> = 3.4) podczas wykonywania z dowolnego katalogu jest:
from pathlib import Path two_up = Path(__file__).resolve().parents[1]
źródło
Aby uzyskać dostęp do katalogu 2 poziomy w górę:
import os.path as path two_up = path.abspath(path.join(os.getcwd(),"../.."))
źródło
Osobiście uważam, że użycie modułu os jest najłatwiejszą metodą, jak opisano poniżej. Jeśli przechodzisz tylko o jeden poziom w górę, zamień („../ ..”) na („..”).
import os os.chdir('../..') --Check: os.getcwd()
źródło
Zauważyłem, że poniższe działa dobrze w wersji 2.7.x.
import os two_up = os.path.normpath(os.path.join(__file__,'../'))
źródło
Możesz użyć tego jako ogólnego rozwiązania:
import os def getParentDir(path, level=1): return os.path.normpath( os.path.join(path, *([".."] * level)) )
źródło
Bardziej wieloplatformowe wdrożenie będzie:
import pathlib two_up = (pathlib.Path(__file__) / ".." / "..").resolve()
Używanie
parent
nie jest obsługiwane w systemie Windows. Należy również dodać.resolve()
do:źródło
parent
nie działa w systemie Windows? Wydaje się, że zostało to naprawione jakiś czas temu, odkąd napisałeś ten komentarz. U mnie działa dobrze, używając Pythona 3.7.2 w systemie Windows 10.parent
pracować na systemie Windows 10 z Pythonem 3.6.5. O której wersji Pythona mówisz @Zhukovgeen?Zakładając, że chcesz uzyskać dostęp do folderu o nazwie xzy dwa foldery w pliku Pythona. To działa dla mnie i niezależnie od platformy.
„.././xyz”
źródło
(pathlib.Path ('../../')) .resolve ()
źródło
Nie widzę jeszcze realnej odpowiedzi na 2.7, która nie wymaga instalowania dodatkowych zależności, a także zaczyna się od katalogu pliku. Nie jest to przyjemne rozwiązanie jednokreskowe, ale nie ma nic złego w korzystaniu ze standardowych narzędzi.
import os grandparent_dir = os.path.abspath( # Convert into absolute path string os.path.join( # Current file's grandparent directory os.path.join( # Current file's parent directory os.path.dirname( # Current file's directory os.path.abspath(__file__) # Current file path ), os.pardir ), os.pardir ) ) print grandparent_dir
Aby udowodnić, że to działa, zacznę tutaj,
~/Documents/notes
aby pokazać, że bieżący katalog nie wpływa na wynik. Umieściłem plikgrandpa.py
z tym skryptem w folderze o nazwie „scripts”. Przeszukuje do katalogu Dokumenty, a następnie do katalogu użytkownika na komputerze Mac.(testing)AlanSE-OSX:notes AlanSE$ echo ~/Documents/scripts/grandpa.py /Users/alancoding/Documents/scripts/grandpa.py (testing)AlanSE-OSX:notes AlanSE$ python2.7 ~/Documents/scripts/grandpa.py /Users/alancoding
To oczywista ekstrapolacja odpowiedzi dla rodzica reż . Lepiej jest użyć rozwiązania ogólnego niż mniej dobrego w mniejszej liczbie wierszy.
źródło
dla py 3.4 i nowszych, pathlib
przykład:
from pathlib import Path path = Path("../../data/foo/someting.csv").resolve()
źródło