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

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 ''.


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'

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'

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

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)

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:]

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}')


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.