Как получить только последнюю часть пути в Python?

233

Предположим, что в Python у меня есть такой путь:

/folderA/folderB/folderC/folderD/

Как я могу получить только folderDчасть?

Pepero
источник

Ответы:

389

Используйте os.path.normpath, тогда os.path.basename:

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

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

Фред Фу
источник
1
Сначала я думал, rstrip('/')что будет проще, но потом быстро понял, что мне придется использовать rstrip(os.path.sep), поэтому очевидно, что использование normpathоправдано.
Эрик Каплун
Кажется, это не работает для длинных путей Windows, например, '\\\\?\\D:\\A\\B\\C\\'и '\\\\?\\UNC\\svr\\B\\C\\'(возвращает пустую строку). Это решение работает для всех случаев.
omasoud
26

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

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

ОБНОВЛЕНИЕ 1: Этот подход работает, если вы предоставите его /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)

ОБНОВЛЕНИЕ 2: Как указывал Ларс , внося изменения, чтобы приспособить трейлинг «/».

>>> from os.path import normpath, basename
>>> basename(normpath('/folderA/folderB/folderC/folderD/'))
'folderD'
Срикар Аппалараджу
источник
В Python-думать, os.path.basename ("... /") правильно выдает ''. Да, я тоже считаю это неоптимальным. Однако решение ... basename (... normpath ... ниже) является каноническим.
Кэмерон Лэйрд
@ lars да! только что увидел, что в этом случае нормализуйте путь, прежде чем вводить его в basename. os.path.basename (os.path.normpath ('/ folderA / folderB / folderC / folderD /'))
Срикар Аппалараджу
ОБНОВЛЕНИЕ2 - лучший подход, который я нашел до сих пор.
Акки
23

С Python 3 вы можете использовать pathlibмодуль ( pathlib.PurePathнапример):

>>> import pathlib

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

Если вам нужно имя последней папки, в которой находится файл:

>>> path = pathlib.PurePath('/folderA/folderB/folderC/folderD/file.py')
>>> path.parent.name
'folderD'
jinnlao
источник
18

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

>>> 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
Что ваш подход решает иначе / лучше, чем вышеупомянутое?
user1767754
9

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

pathname = "/folderA/folderB/folderC/folderD/filename.py"
head, tail = os.path.split(os.path.split(pathname)[0])
print(head + "   "  + tail)
user1767754
источник
2

Наивное решение (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
источник
Зачем кому-то использовать это?
Chris_Rands
1

Мне нравится метод частей Path для этого:

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}')
Андрей Магерман
источник
0
path = "/folderA/folderB/folderC/folderD/"
last = path.split('/').pop()
GSto
источник
10
Серьезно, используйте os.pathмодуль.
ВЫЙТИ - Anony-Mousse
0
str = "/folderA/folderB/folderC/folderD/"
print str.split("/")[-2]
Эндрю Санки
источник
он хочет folderD. нетfolderC
Srikar Appalaraju
1
Это дает "folderD", потому что завершающий слеш делает последний элемент в списке ""
neil
21
Серьезно, используйте os.pathмодуль.
ВЫЙТИ - Anony-Mousse