Jak uzyskać tylko ostatnią część ścieżki w Pythonie?

232

W Pythonie załóżmy, że mam taką ścieżkę:

/folderA/folderB/folderC/folderD/

Jak mogę zdobyć tylko folderDczęść?

pepero
źródło

Odpowiedzi:

389

Użyj os.path.normpath, a następnie os.path.basename:

>>> os.path.basename(os.path.normpath('/folderA/folderB/folderC/folderD/'))
'folderD'

Pierwszy usuwa wszelkie końcowe ukośniki, drugi daje ostatnią część ścieżki. Użycie basenamedaje tylko wszystko po ostatnim ukośniku, co w tym przypadku jest ''.

Fred Foo
źródło
1
Początkowo myślałem rstrip('/'), że będzie to prostsze, ale szybko zdałem sobie sprawę, że będę musiał użyć rstrip(os.path.sep), więc oczywiście użycie normpathjest uzasadnione.
Erik Kaplun
Wydaje się, że nie działa to na długich ścieżkach systemu Windows, np. '\\\\?\\D:\\A\\B\\C\\'I '\\\\?\\UNC\\svr\\B\\C\\'(zwraca pusty ciąg) To rozwiązanie działa we wszystkich przypadkach.
omasoud
25

Mógłbyś

>>> import os
>>> os.path.basename('/folderA/folderB/folderC/folderD')

AKTUALIZACJA 1: To podejście działa, jeśli podasz /folderA/folderB/folderC/folderD/xx.py. To daje xx.py jako basename. Chyba nie tego chcesz. Więc możesz to zrobić -

>>> import os
>>> path = "/folderA/folderB/folderC/folderD"
>>> if os.path.isdir(path):
        dirname = os.path.basename(path)

AKTUALIZACJA 2: Jak zauważył Lars , wprowadzanie zmian w celu dostosowania końcowego / „.

>>> from os.path import normpath, basename
>>> basename(normpath('/folderA/folderB/folderC/folderD/'))
'folderD'
Srikar Appalaraju
źródło
W Python-think os.path.basename („... /”) poprawnie zwraca ''. Tak, ja też uważam to za nieoptymalne. Rozwiązanie ... basename (... normpath ... poniżej) jest jednak kanoniczne.
Cameron Laird,
@lars yeah! właśnie zobaczyłem, że w takim przypadku najpierw normalizuj ścieżkę przed podaniem jej do basename. os.path.basename (os.path.normpath ('/ folderA / folderB / folderC / folderD /'))
Srikar Appalaraju
UPDATE2 to najlepsze podejście, jakie do tej pory znalazłem.
akki
23

W Pythonie 3 możesz użyć pathlibmodułu ( pathlib.PurePathna przykład):

>>> import pathlib

>>> path = pathlib.PurePath('/folderA/folderB/folderC/folderD/')
>>> path.name
'folderD'

Jeśli chcesz nazwę ostatniego folderu, w którym znajduje się plik:

>>> path = pathlib.PurePath('/folderA/folderB/folderC/folderD/file.py')
>>> path.parent.name
'folderD'
jinnlao
źródło
18

Oto moje podejście:

>>> import os
>>> print os.path.basename(
        os.path.dirname('/folderA/folderB/folderC/folderD/test.py'))
folderD
>>> print os.path.basename(
        os.path.dirname('/folderA/folderB/folderC/folderD/'))
folderD
>>> print os.path.basename(
        os.path.dirname('/folderA/folderB/folderC/folderD'))
folderC
Mike Mitterer
źródło
1
Co twoje podejście rozwiązuje inaczej / lepiej niż wyżej wspomniane?
user1767754,
9

Szukałem rozwiązania, aby uzyskać ostatnią nazwę folderu, w którym znajduje się plik, użyłem go splitdwa razy, aby uzyskać właściwą część. To nie jest pytanie, ale Google przeniosło mnie tutaj.

pathname = "/folderA/folderB/folderC/folderD/filename.py"
head, tail = os.path.split(os.path.split(pathname)[0])
print(head + "   "  + tail)
użytkownik1767754
źródło
2

Naiwne rozwiązanie (Python 2.5.2+):

s="/path/to/any/folder/orfile"
desired_dir_or_file = s[s.rindex('/',0,-1)+1:-1] if s.endswith('/') else s[s.rindex('/')+1:]
mshsayem
źródło
dlaczego ktoś miałby to wykorzystać?
Chris_Rands,
1

W tym celu podoba mi się metoda Path części :

grandparent_directory, parent_directory, filename = Path(export_filename).parts[-3:]
log.info(f'{t: <30}: {num_rows: >7} Rows exported to {grandparent_directory}/{parent_directory}/{filename}')
Andrew Magerman
źródło
0
path = "/folderA/folderB/folderC/folderD/"
last = path.split('/').pop()
GSto
źródło
10
Poważnie, użyj os.pathmodułu.
Ma ZAKOŃCZENIE - Anony-Mousse
0
str = "/folderA/folderB/folderC/folderD/"
print str.split("/")[-2]
Andrew Sledge
źródło
on chce folderD. niefolderC
Srikar Appalaraju,
1
Daje „folderD”, ponieważ ukośnik końcowy sprawia, że ​​ostatnim elementem na liście jest „”
neil
21
Poważnie, użyj os.pathmodułu.
Ma ZAKOŃCZENIE - Anony-Mousse