Получить имя папки файла в 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 для '/ foo / bar /' возвращает 'bar', функция basename () возвращает пустую строку ('').


Все вместе:

>>> import os
>>> path=os.path.dirname("C:/folder1/folder2/filename.xml")
>>> path
'C:/folder1/folder2'
>>> os.path.basename(path)
'folder2'
fedorqui 'ТАК, хватит вредить'
источник
7
В качестве альтернативы, чтобы получить последнюю порцию, вы можете использоватьos.path.basename
mgilson
@mgilson хорошее замечание! Обновил мой ответ, чтобы отразить это, большое спасибо
fedorqui 'SO stop harming'
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)
dfresh22
источник
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
tjd сидней
источник
1

вы можете использовать pathlib

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

Результатом выше было следующее:

'folder2'
Аллен Цзин
источник