2015-10-27 28 views
11

W języku Python jakiego polecenia należy użyć, aby uzyskać nazwę folderu zawierającego plik, z którym pracuję?Uzyskaj nazwę folderu pliku w języku Python

"C:\folder1\folder2\filename.xml"

Tutaj "folder2" jest to, co chcę dostać.

Jedyne co mam wymyślić jest użycie os.path.split dwukrotnie:

folderName = os.path.split(os.path.split("C:\folder1\folder2\filename.xml")[0])[1]

Czy istnieje lepszy sposób to zrobić?

+0

możliwe duplikat: [Python - Wyciąg Ścieżka folderu ze ścieżki pliku] (http://stackoverflow.com/q/17057544/4279) – jfs

Odpowiedz

21

Można użyć dirname:

os.path.dirname(path) 

zwróci nazwę katalogu ścieżki nazw plików. Jest to pierwszy element zwracany przez ścieżkę do funkcji split().

I podając pełną ścieżkę, można podzielić normalnie, aby uzyskać ostatnią część ścieżki. Na przykład, za pomocą basename:

os.path.basename(path) 

zwróci nazwę bazową ścieżkę nazw plików. Jest to drugi element z pary zwróconej przez przekazanie ścieżki do funkcji split(). Zauważ, że wynik tej funkcji jest różny od uniksowego programu basenowego o nazwie ; gdzie basename dla '/ foo/bar /' zwraca 'pasek', funkcja basename() zwraca pusty ciąg ("').


Wszystko razem:

>>> import os 
>>> path=os.path.dirname("C:/folder1/folder2/filename.xml") 
>>> path 
'C:/folder1/folder2' 
>>> os.path.basename(path) 
'folder2' 
+2

Alternatywnie, aby dostać ostatnią część ciebie, może użyć 'os.path.basename' – mgilson

+0

@mgilson dobry punkt! Zaktualizowałem moją odpowiedź, aby to odzwierciedlić, wiele dzięki – fedorqui

4

os.path.dirname jest to, czego szukasz -

os.path.dirname(r"C:\folder1\folder2\filename.xml") 

Upewnij się poprzedzić r do łańcucha tak, aby jej traktować jako surowca sznurka .

Demo -

In [46]: os.path.dirname(r"C:\folder1\folder2\filename.xml") 
Out[46]: 'C:\\folder1\\folder2' 

Jeśli chcesz tylko folder2 można użyć os.path.basename z powyższego przykładu -

os.path.basename(os.path.dirname(r"C:\folder1\folder2\filename.xml")) 

Demo -

In [48]: os.path.basename(os.path.dirname(r"C:\folder1\folder2\filename.xml")) 
Out[48]: 'folder2' 
5

Jesteś patrząc g do użycia dirname.Jeśli chcesz tylko jeden katalog, można użyć os.path.basename,

Kiedy umieścić wszystko razem wygląda to tak:

os.path.basename(os.path.dirname('dir/sub_dir/other_sub_dir/file_name.txt')) 

To powinno cię „other_sub_dir”

Poniższa nie jest idealny podejście, ale pierwotnie proponowałem, używając os.path.split, i po prostu otrzymałem ostatni element. który będzie wyglądać następująco:

os.path.split(os.path.dirname('dir/sub_dir/other_sub_dir/file_name.txt'))[-1] 
+4

, zamiast dzielić się na 'str.split', lepiej użyć' os.path.split' (która lepiej radzi sobie z różnicami w różnych systemach). – mgilson

+0

Tak. Masz rację! Przemknęło mi przez myśl. Dzięki @mgilson – idjaw