Як отримати лише останню частину шляху в Python?


233

Припустимо, в Python у мене такий шлях:

/folderA/folderB/folderC/folderD/

Як я можу отримати лише folderDчастину?

Відповіді:


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

25

Ви могли б зробити

>>> 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-think, os.path.basename ("... /") правильно поступається ''. Так, я теж вважаю це неоптимальним. … Рішення базової (… нормпат…) рішення нижче є канонічним. Хоча
Камерон Лард

@lars так! щойно побачив, що в цьому випадку спочатку нормалізуйте шлях, перш ніж подавати його до базового імені. os.path.basename (os.path.normpath ('/ папкаA / папкаB / папкаC / папкаD /'))
Srikar Appalaraju

UPDATE2 - це найкращий підхід, який я знайшов поки що.
аккі

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'

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
Що ваш підхід вирішує інше / краще, ніж вищезгадане?
користувач1767754

9

Я шукав рішення, щоб отримати останнє ім'я папки, де знаходиться файл, я просто splitдва рази використав , щоб отримати потрібну частину. Це не питання, але Google переніс мене тут.

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

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

навіщо хтось цим користуватися?
Chris_Rands

1

Мені подобаються частини методи Шляхи для цього:

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


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.