Как я могу извлечь путь к папке из пути к файлу в Python?


117

Я хотел бы получить только путь к папке из полного пути к файлу.

Например, T:\Data\DBDesign\DBDesign_93_v141b.mdbи я хотел бы получить просто T:\Data\DBDesign(без учета \DBDesign_93_v141b.mdb).

Я пробовал что-то вроде этого:

existGDBPath = r'T:\Data\DBDesign\DBDesign_93_v141b.mdb'
wkspFldr = str(existGDBPath.split('\\')[0:-1])
print wkspFldr 

но это дало мне такой результат:

['T:', 'Data', 'DBDesign']

что не является результатом, который мне нужен (быть T:\Data\DBDesign).

Есть идеи, как я могу получить путь к моему файлу?

Ответы:


141

Вы почти достигли цели с использованием этой splitфункции. Вам просто нужно было соединить строки, как показано ниже.

>>> import os
>>> '\\'.join(existGDBPath.split('\\')[0:-1])
'T:\\Data\\DBDesign'

Хотя я бы рекомендовал использовать для этого os.path.dirnameфункцию, вам просто нужно передать строку, и она сделает всю работу за вас. Поскольку кажется, что вы работаете в Windows, подумайте об использовании этой abspathфункции. Пример:

>>> import os
>>> os.path.dirname(os.path.abspath(existGDBPath))
'T:\\Data\\DBDesign'

Если после разделения вы хотите указать и имя файла, и путь к каталогу, вы можете использовать os.path.splitфункцию, которая возвращает кортеж, как показано ниже.

>>> import os
>>> os.path.split(os.path.abspath(existGDBPath))
('T:\\Data\\DBDesign', 'DBDesign_93_v141b.mdb')

os.sep.join(existGDBPath.split(os.sep)[:-1]выглядит красивее.
Дэйв Бэббит

88

С МОДУЛЕМ PATHLIB (ОБНОВЛЕННЫЙ ОТВЕТ)

Следует рассмотреть возможность использования pathlib для новых разработок. Он находится в stdlib для Python3.4, но доступен в PyPI для более ранних версий. Эта библиотека предоставляет более объектно-ориентированный метод управления путями, <opinion>ее гораздо легче читать и программировать </opinion>.

>>> import pathlib
>>> existGDBPath = pathlib.Path(r'T:\Data\DBDesign\DBDesign_93_v141b.mdb')
>>> wkspFldr = existGDBPath.parent
>>> print wkspFldr
Path('T:\Data\DBDesign')

С МОДУЛЕМ ОС

Используйте модуль os.path :

>>> import os
>>> existGDBPath = r'T:\Data\DBDesign\DBDesign_93_v141b.mdb'
>>> wkspFldr = os.path.dirname(existGDBPath)
>>> print wkspFldr 
'T:\Data\DBDesign'

Вы можете пойти дальше и предположить, что если вам нужно сделать какие-то манипуляции с именами файлов, они уже реализованы os.path. Если нет, вам, вероятно, все равно придется использовать этот модуль в качестве строительного блока.


Path().parentто, что я искал!
iedmrc

44

Встроенный подмодуль os.path имеет функцию именно для этой задачи.

import os
os.path.dirname('T:\Data\DBDesign\DBDesign_93_v141b.mdb')


0

Вот моя маленькая вспомогательная утилита для разделения путей в int файл, токены пути:

import os    
# usage: file, path = splitPath(s)
def splitPath(s):
    f = os.path.basename(s)
    p = s[:-(len(f))-1]
    return f, p

0

Любой, кто пытается сделать это в интерфейсе калькулятора полей таблиц ГИС ESRI, может сделать это с помощью парсера Python :

PathToContainFolder =

"\\".join(!FullFilePathWithFileName!.split("\\")[0:-1])

так что

\ Users \ me \ Desktop \ Новая папка \ file.txt

становится

\ Users \ me \ Desktop \ Новая папка

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.