2010-10-13 8 views

Odpowiedz

202

Zastosowanie os.path.normpath, następnie os.path.basename:

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

Pierwsze Odcina wszelkie końcowe ukośniki, drugi daje ostatnią część ścieżki. Użycie tylko basename daje wszystko po ostatnim ukośniku, który w tym przypadku jest ''.

+0

Początkowo myślałem, że 'rstrip ('/')' byłoby prostsze, ale szybko zorientowałem się, że będę musiał użyć 'rstrip (os.path.sep)', więc oczywiście użycie 'normpath' jest uzasadnione. –

14

Można zrobić

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

UPDATE1: To podejście działa w przypadku dajesz go /folderA/folderB/folderC/folderD/xx.py. Daje to xx.py jako nazwę podstawową. Co nie jest tym, czego chcesz, chyba. Więc można to zrobić -

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

Update2: Lars wskazał, dokonywania zmian, tak aby pomieścić spływu '/'.

>>> from os.path import normpath, basename 
>>> basename(normpath('/folderA/folderB/folderC/folderD/')) 
'folderD' 
+0

W Pythonie myśleć, os.path.basename ("... /") poprawnie daje ''. Tak, ja też uważam to za nieoptymalne. The ... basename (... normpath ... rozwiązanie poniżej jest kanoniczne, chociaż ... –

+0

@ lars tak! Właśnie zobaczyłem, że w takim przypadku znormalizuj ścieżkę najpierw, zanim podasz ją do głównej nazwy. Os.path.basename (os.path .normpath ('/ folderA/folderB/folderC/folderD /')) –

+0

UPDATE2 jest najlepszym rozwiązaniem, jakie udało mi się znaleźć do tej pory. – akki

0
path = "/folderA/folderB/folderC/folderD/" 
last = path.split('/').pop() 
+7

Poważnie, użyj modułu 'os.path'. –

0
str = "/folderA/folderB/folderC/folderD/" 
print str.split("/")[-2] 
+0

chce 'folderD'. nie "folderC" –

+1

Podaje "folderD", ponieważ końcowy ukośnik powoduje, że ostatni element na liście "" – neil

+14

Poważnie, użyj modułu 'os.path'. –

1

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

Szukałem rozwiązania dostać ostatnią nazwa_folderu, gdzie znajduje się plik, po prostu stosować podzielone dwa razy, aby uzyskać prawo część. To nie jest pytanie, ale Google mnie przeniesiono tutaj.

pathname = "/folderA/folderB/folderC/folderD/filename.py" 
head, tail = os.path.split(os.path.split(pathname)[0]) 
print(head + " " + tail) 
0

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 
+0

Co Twoje podejście rozwiązuje inaczej/lepiej niż wyżej wymienione? – user1767754

+0

Wygląda lepiej dla mnie, łatwiejsze do odczytania. –

Powiązane problemy