2010-10-13 2 views

ответ

202

Использование os.path.normpath, затем os.path.basename:

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

Первые срывает любые слешей, второй дает последнюю часть пути. Использование только basename дает все после последней косой черты, которая в этом случае равна ''.

+0

Я изначально думал, что 'rstrip ('/')' будет проще, но затем быстро понял, что мне придется использовать 'rstrip (os.path.sep)', поэтому очевидно, что использование 'normpath' оправдано. –

14

Вы могли бы сделать

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

Update1: Этот подход работает в случае, если вы даете ему /folderA/folderB/folderC/folderD/xx.py. Это дает xx.py как базовое имя. Думаю, это не то, что вы хотите. Таким образом, вы могли бы сделать это -

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

UPDATE2: Как Lars отметил, что делает изменения так, чтобы приспособить отставая '/'.

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

В Python-думаю, os.path.basename ("... /") правильно дает ''. Да, я тоже считаю, что это не оптимально. Однако ... basename (... normpath ... решение ниже является каноническим). –

+0

@lars да! Просто увидел, что в этом случае сначала нормализуйте путь до подачи его в basename. Os.path.basename (os.path .normpath ('/ folderA/folderB/folderC/folderD /')) –

+0

UPDATE2 - лучший подход, который я нашел до сих пор. – akki

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

Серьезно используйте модуль 'os.path'. –

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

он хочет 'folderD'. не 'folderC' –

+1

Он дает« folderD », потому что конечная косая черта делает последний элемент в списке« » – neil

+14

Серьезно, используйте модуль' os.path'. –

1

Наивное решение (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

Я искал решение, чтобы получить последнюю FOLDERNAME, где находится файл, я просто использовал расщепленные два раз, чтобы получить право часть. Это не вопрос, но google перевел меня сюда.

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

Вот мой подход:

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

Что ваш подход решает разные/лучше, чем указано выше? – user1767754

+0

Мне лучше, легче читать. –