Uzyskaj nazwę folderu pliku w Pythonie


87

W Pythonie jakiego polecenia powinienem użyć, aby uzyskać nazwę folderu zawierającego plik, z którym pracuję?

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

Oto, "folder2"co chcę dostać.

Jedyne, co wymyśliłem, to użyć os.path.splitdwa razy:

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

Czy jest lepszy sposób, aby to zrobić?


Odpowiedzi:


164

Możesz użyć dirname:

os.path.dirname(path)

Zwróć nazwę katalogu lub pathname path. Jest to pierwszy element pary zwracany przez przekazanie ścieżki do funkcji split ().

Biorąc pod uwagę pełną ścieżkę, możesz normalnie podzielić, aby uzyskać ostatnią część ścieżki. Na przykład używając basename:

os.path.basename(path)

Zwróć nazwę podstawową ścieżki do ścieżki. To jest drugi element pary zwracany przez przekazanie ścieżki do funkcji split (). Zwróć uwagę, że wynik działania tej funkcji różni się od wyniku działania programu basename w systemie Unix; gdzie basename dla '/ foo / bar /' zwraca 'bar', funkcja basename () zwraca pusty łańcuch ('').


Wszyscy razem:

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

7
Alternatywnie, aby dostać ostatnią porcję, możesz użyćos.path.basename
mgilson

@mgilson dobra uwaga! Zaktualizowałem moją odpowiedź, aby to odzwierciedlić,
wielkie

17

Chcesz użyć dirname . Jeśli chcesz tylko ten jeden katalog, możesz użyć os.path.basename ,

Po złożeniu wygląda to tak:

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

To powinno dać ci „other_sub_dir”

Poniższe podejście nie jest idealnym podejściem, ale pierwotnie zaproponowałem, używając os.path.split i po prostu otrzymałem ostatnią pozycję. który wyglądałby tak:

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

5
zamiast dzielić się z str.split, lepiej jest użyć os.path.split(który lepiej radzi sobie z różnicami między różnymi systemami operacyjnymi).
mgilson

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

9

to jest dość stare, ale jeśli używasz Pythona 3.4 lub nowszego, użyj PathLib .

# using OS
import os
path=os.path.dirname("C:/folder1/folder2/filename.xml")
print(path)
print(os.path.basename(path))

# using pathlib
import pathlib
path = pathlib.PurePath("C:/folder1/folder2/filename.xml")
print(path.parent)
print(path.parent.name)

8

os.path.dirname jest tym, czego szukasz -

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

Upewnij się, że rciąg jest dodawany na początku, aby był traktowany jako nieprzetworzony.

Próbny -

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

Jeśli chcesz folder2, możesz użyć os.path.basenamepowyższego, Przykład -

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

Próbny -

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

1

Możesz uzyskać pełną ścieżkę jako ciąg, a następnie podzielić ją na listę przy użyciu znaku separatora systemu operacyjnego. Następnie uzyskujesz nazwę programu, nazwę folderu itp., Uzyskując dostęp do elementów z końca listy za pomocą indeksów ujemnych.

Lubię to:

import os
strPath = os.path.realpath(__file__)
print( f"Full Path    :{strPath}" )
nmFolders = strPath.split( os.path.sep )
print( "List of Folders:", nmFolders )
print( f"Program Name :{nmFolders[-1]}" )
print( f"Folder Name  :{nmFolders[-2]}" )
print( f"Folder Parent:{nmFolders[-3]}" )

Wynik powyższego był następujący:

Full Path    :C:\Users\terry\Documents\apps\environments\dev\app_02\app_02.py
List of Folders: ['C:', 'Users', 'terry', 'Documents', 'apps', 'environments', 'dev', 'app_02', 'app_02.py']
Program Name :app_02.py
Folder Name  :app_02
Folder Parent:dev

1

możesz użyć pathlib

from pathlib import Path
Path(r"C:\folder1\folder2\filename.xml").parts[-2]

Wynik powyższego był następujący:

'folder2'
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.