#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-это командная строка, используемая для выполнения программы