Czy ktoś mógłby mi powiedzieć, jak uzyskać katalog nadrzędny ścieżki w Pythonie na wiele platform. Na przykład
C:\Program Files ---> C:\
i
C:\ ---> C:\
Jeśli katalog nie ma katalogu nadrzędnego, zwraca sam katalog. Pytanie może wydawać się proste, ale nie mogłem go wykopać przez Google.
os.path.dirname
jest funkcją tego, jaka+=5-4
jest bardziej skomplikowany niża+=1
. Pytanie dotyczyło tylko katalogu nadrzędnego, a nie tego, czy istnieje lub czy prawdziwy katalog nadrzędny, zakładając, że przeszkadzają mu dowiązania symboliczne.os.pardir
nieos.path.pardir
.os.pardir
ios.path.pardir
są w rzeczywistości poprawne (są identyczne).os.path.dirname
daje różne wyniki w zależności od tego, czy na ścieżce znajduje się ukośnik końcowy. Jeśli chcesz uzyskać wiarygodne wyniki, musisz użyćos.path.join
metody opisanej powyżej.Używanie
os.path.dirname
:Zastrzeżenie:
os.path.dirname()
daje różne wyniki w zależności od tego, czy końcowy ukośnik jest zawarty na ścieżce. To może, ale nie musi być semantyka, którą chcesz. Por. Odpowiedź @ kender za pomocąos.path.join(yourpath, os.pardir)
.źródło
os.path.dirname(r'C:\Program Files')
co? Python po prostu podaje katalog, w którym powinien znajdować się plik „Program Files”. Co więcej, nawet nie musi istnieć, oto:os.path.dirname(r'c:\i\like\to\eat\pie')
wyjścia'c:\\i\\like\\to\\eat'
Metoda Pathlib (Python 3.4+)
Tradycyjna metoda
Jakiej metody powinienem użyć?
Użyj tradycyjnej metody, jeśli:
Martwisz się o istniejące błędy generowania kodu, jeśli miałby on używać obiektu Pathlib. (Ponieważ obiektów Pathlib nie można łączyć z łańcuchami.)
Twoja wersja Pythona jest mniejsza niż 3,4.
Potrzebujesz łańcucha i otrzymałeś ciąg. Załóżmy na przykład, że masz ciąg reprezentujący ścieżkę do pliku i chcesz uzyskać katalog nadrzędny, aby móc umieścić go w ciągu JSON. Byłoby głupotą konwersja na obiekt Pathlib i powrót w tym celu.
Jeśli żadne z powyższych nie ma zastosowania, użyj Pathlib.
Co to jest Pathlib?
Jeśli nie wiesz, co to jest Pathlib, moduł Pathlib to wspaniały moduł, który sprawia, że praca z plikami jest jeszcze łatwiejsza. Większość, jeśli nie wszystkie wbudowane moduły Pythona, które działają z plikami, akceptują zarówno obiekty, jak i łańcuchy Pathlib. Podkreśliłem poniżej kilka przykładów z dokumentacji Pathlib, które pokazują niektóre fajne rzeczy, które możesz zrobić z Pathlib.
Poruszanie się po drzewie katalogów:
Właściwości ścieżki zapytania:
źródło
pip install pathlib2
i skorzystaj z backportu.os.sep
!C:\Program Files
--->C:\\\
C:\
--->C:\\\
źródło
os.path.abspath(r'E:\O3M_Tests_Embedded\branches\sw_test_level_gp\test_scripts\..\..')
Wynik:E:\\O3M_Tests_Embedded\\branches
/
.Alternatywne rozwiązanie @kender
gdzie
yourpath
jest ścieżka, dla której chcesz nadrzędny.Ale to rozwiązanie nie jest idealne, ponieważ nie poradzi sobie w przypadku, gdy
yourpath
jest pusty ciąg lub kropka.To inne rozwiązanie ładniej poradzi sobie z tym narożnym futerałem:
Tutaj dane wyjściowe dla każdego znalezionego przypadku (ścieżka wejściowa jest względna):
Ścieżka wejściowa jest bezwzględna (ścieżka systemu Linux):
źródło
źródło
os.path.split(os.path.abspath("this/is/a/dir/"))[0]
zwraca'/home/daniel/this/is/a'
zgodnie z oczekiwaniami. W tej chwili nie mam działającego pola Windows, aby to sprawdzić. W jakiej konfiguracji zaobserwowałeś zgłaszane zachowanie?parentdir = os.path.split(os.path.apspath(dir[:-1]))[0]
. To - jestem pewien - działa, ponieważ jeśli na końcu jest ukośnik, jest on usuwany; jeśli nie ma ukośnika, to nadal będzie działać (nawet jeśli ostatnia część ścieżki ma tylko jeden znak długości) z powodu poprzedniego ukośnika. Zakłada to oczywiście, że ścieżka jest poprawna i nie mówi czegoś takiego/a//b/c///d////
(w unixie jest to nadal poprawne), co w większości przypadków jest (właściwe), zwłaszcza gdy wykonujesz coś podobnegoos.path.abspath
lub jakąkolwiek innąos.path
funkcję.os.path.split("a/b//c/d///")
, jak na przykładcd //////dev////// is equivalent to
cd / dev / `orcd /dev
; wszystkie są ważne w systemie Linux. Właśnie pojawił się z tym i może to być przydatne, ale:os.path.split(path[:tuple(ind for ind, char in enumerate(path) if char != "/" and char != "\\")[-1]])[0]
. (To w zasadzie wyszukuje ostatni nie-ukośnik i pobiera podciąg ścieżki do tego znaku.) Użyłem,path = "/a//b///c///d////"
a następnie uruchomiłem wyżej wymienioną instrukcję i otrzymałem'/a//b///c'
.Przestrzegać:
źródło
źródło
Jeśli chcesz tylko na nazwę folderu, który jest bezpośrednim rodzicem pliku przewidzianego jako argument a nie na bezwzględnej ścieżki do tego pliku:
os.path.split(os.path.dirname(currentDir))[1]
tj. o
currentDir
wartości/home/user/path/to/myfile/file.ext
Powyższe polecenie zwróci:
myfile
źródło
Na przykład w Ubuntu:
Na przykład w systemie Windows:
Oba przykłady wypróbowane w Pythonie 2.7
źródło
źródło
Załóżmy, że mamy taką strukturę katalogów
1]
Chcemy uzyskać dostęp do ścieżki „P” z katalogu R, a następnie możemy uzyskać dostęp za pomocą
2]
Chcemy uzyskać dostęp do ścieżki katalogu „Q” z katalogu R, a następnie możemy uzyskać dostęp za pomocą
źródło
Po prostu dodając coś do odpowiedzi Tunga (musisz użyć,
rstrip('/')
aby być bardziej bezpiecznym, jeśli korzystasz z unixa).Ale jeśli nie używasz
rstrip('/')
, biorąc pod uwagę twój wkład jestwyszedłby
co prawdopodobnie nie jest tym, na co patrzysz, ponieważ chcesz obu
"../data/replies/"
i"../data/replies"
zachowywać się w ten sam sposób.źródło
źródło
Możesz go użyć, aby uzyskać katalog nadrzędny bieżącej lokalizacji pliku py.
źródło
POBIERZ ścieżkę katalogu nadrzędnego i utwórz nowy katalog (nazwę
new_dir
)Uzyskaj ścieżkę katalogu nadrzędnego
Przykład 1
Przykład 2
źródło
Więc
..
pomagaźródło
źródło
Wszystkie powyższe odpowiedzi doskonale nadają się do przejścia o jeden lub dwa poziomy katalogów, ale mogą być nieco kłopotliwe, jeśli trzeba przejrzeć drzewo katalogów o wiele poziomów (powiedzmy 5 lub 10). Można to zrobić zwięźle, dołączając do listy
N
os.pardir
s wos.path.join
. Przykład:źródło