Отримайте ім'я папки файлу в Python


87

У Python, яку команду слід використовувати для отримання імені папки, що містить файл, з яким я працюю?

"C:\folder1\folder2\filename.xml"

Ось "folder2"те, що я хочу отримати.

Єдине, що я придумав, це використовувати os.path.splitдвічі:

folderName = os.path.split(os.path.split("C:\folder1\folder2\filename.xml")[0])[1]

Чи є кращий спосіб це зробити?


Відповіді:


164

Ви можете використовувати dirname:

os.path.dirname(path)

Поверніть ім'я каталогу каталогу шляху. Це перший елемент пари, повернутий шляхом передачі шляху до функції split ().

А враховуючи повний шлях, ви можете нормально розділити, щоб отримати останню частину шляху. Наприклад, використовуючи basename:

os.path.basename(path)

Повернення базового імені шляху до шляху. Це другий елемент пари, повернутий шляхом передачі шляху до функції split (). Зверніть увагу, що результат цієї функції відрізняється від програми Unix basename; де basename для '/ foo / bar /' повертає 'bar', функція basename () повертає порожній рядок ('').


Всі разом:

>>> import os
>>> path=os.path.dirname("C:/folder1/folder2/filename.xml")
>>> path
'C:/folder1/folder2'
>>> os.path.basename(path)
'folder2'

7
Крім того, щоб отримати останню порцію, ви можете використатиos.path.basename
mgilson

@mgilson хороший момент! Оновив свою відповідь, щоб відобразити це, велика подяка
Fedorqui "ТАК перестань шкодити"

17

Ви хочете використовувати dirname . Якщо вам потрібен лише один каталог, ви можете використовувати os.path.basename ,

Коли все разом скласти, це виглядає так:

os.path.basename(os.path.dirname('dir/sub_dir/other_sub_dir/file_name.txt'))

Це має принести вам "other_sub_dir"

Далі не є ідеальним підходом, але я спочатку запропонував, використовуючи os.path.split, і просто отримав останній елемент. що виглядатиме так:

os.path.split(os.path.dirname('dir/sub_dir/other_sub_dir/file_name.txt'))[-1]

5
замість того, щоб розділяти str.split, краще використовувати os.path.split(що краще обробляє відмінності різних ОС).
mgilson

Так. Ти правий! Прослизнув мій розум. Дякую @mgilson
idjaw

9

це досить давно , але якщо ви використовуєте Python 3.4 або вище, використовуйте PathLib .

# using OS
import os
path=os.path.dirname("C:/folder1/folder2/filename.xml")
print(path)
print(os.path.basename(path))

# using pathlib
import pathlib
path = pathlib.PurePath("C:/folder1/folder2/filename.xml")
print(path.parent)
print(path.parent.name)

8

os.path.dirname це те, що ви шукаєте -

os.path.dirname(r"C:\folder1\folder2\filename.xml")

Обов’язково попередньо r до рядка так, щоб його розглядали як необроблений рядок.

Демо -

In [46]: os.path.dirname(r"C:\folder1\folder2\filename.xml")
Out[46]: 'C:\\folder1\\folder2'

Якщо ви просто хочете folder2, ви можете скористатися os.path.basenameнаведеним вище, Приклад -

os.path.basename(os.path.dirname(r"C:\folder1\folder2\filename.xml"))

Демо -

In [48]: os.path.basename(os.path.dirname(r"C:\folder1\folder2\filename.xml"))
Out[48]: 'folder2'

1

Ви можете отримати повний шлях у вигляді рядка, а потім розділити його на список, використовуючи розділовий символ вашої операційної системи. Тоді ви отримуєте назву програми, назву папки тощо, отримуючи доступ до елементів з кінця списку за допомогою негативних індексів.

Подобається це:

import os
strPath = os.path.realpath(__file__)
print( f"Full Path    :{strPath}" )
nmFolders = strPath.split( os.path.sep )
print( "List of Folders:", nmFolders )
print( f"Program Name :{nmFolders[-1]}" )
print( f"Folder Name  :{nmFolders[-2]}" )
print( f"Folder Parent:{nmFolders[-3]}" )

Результатом вищезазначеного було таке:

Full Path    :C:\Users\terry\Documents\apps\environments\dev\app_02\app_02.py
List of Folders: ['C:', 'Users', 'terry', 'Documents', 'apps', 'environments', 'dev', 'app_02', 'app_02.py']
Program Name :app_02.py
Folder Name  :app_02
Folder Parent:dev

1

Ви можете використовувати pathlib

from pathlib import Path
Path(r"C:\folder1\folder2\filename.xml").parts[-2]

Результатом вищезазначеного було таке:

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