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.