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ć?

Wasilij
źródło

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'
fedorqui 'SO przestań szkodzić'
źródło
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]
idjaw
źródło
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)
dfresh22
źródło
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'
Anand S Kumar
źródło
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
tjd Sydney
źródło
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'
Allen Jing
źródło