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

#python #python-3.x

Вопрос:

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

Например T:DataDBDesignDBDesign_93_v141b.mdb , и я хотел бы получить только T:DataDBDesign (исключая DBDesign_93_v141b.mdb ).

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

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

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

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

что не является результатом, которого я требую (бытия T:DataDBDesign ).

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

Ответ №1:

Вы были почти на месте, используя эту 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')
 

Комментарии:

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

2. '\'.join() не является портативным, используйте os.path.join() вместо этого

3. Использует методы str split и join не является переносимым (подумайте / о *nix). os.path имеет все необходимые методы.

Ответ №2:

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

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

 >>> import pathlib
>>> existGDBPath = pathlib.Path(r'T:DataDBDesignDBDesign_93_v141b.mdb')
>>> wkspFldr = existGDBPath.parent
>>> print wkspFldr
Path('T:DataDBDesign')
 

С МОДУЛЕМ ОПЕРАЦИОННОЙ СИСТЕМЫ

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

 >>> import os
>>> existGDBPath = r'T:DataDBDesignDBDesign_93_v141b.mdb'
>>> wkspFldr = os.path.dirname(existGDBPath)
>>> print wkspFldr 
'T:DataDBDesign'
 

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

Комментарии:

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

2. Помечено просто потому, что вы вставили <мнение /> в теги!

Ответ №3:

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

 import os
os.path.dirname('T:DataDBDesignDBDesign_93_v141b.mdb')
 

Ответ №4:

Вот код:

 import os
existGDBPath = r'T:DataDBDesignDBDesign_93_v141b.mdb'
wkspFldr = os.path.dirname(existGDBPath)
print wkspFldr # T:DataDBDesign
 

Ответ №5:

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

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

Ответ №6:

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

Папка для сохранения пути =

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

так что

ПользователияРабочий столНовый folderfile.txt

становится

ПользователияРабочий столНовая папка

Ответ №7:

Я использую это, чтобы изменить текущий рабочий каталог на папку;

 from os import chdir
from os.path import realpath
from os.path import dirname

chdir(realpath(dirname(argv[0])))
 
  • chdir изменяет рабочий каталог. Я сомневаюсь, что тебе это понадобится.
  • realpath следует за символическими ссылками.
  • dirname возвращает только путь
  • argv-это командная строка, используемая для выполнения программы