Использование абсолютных путей unix в windows с python
Я создаю приложение, которое хранит blob файлы на жестком диске, но этот script должен работать как в Linux, так и в Windows, проблема в том, что я хочу дать ему абсолютный путь от корня файловой системы, а не один по сравнению с файлами проекта, это потому, что im использует git и не хочет иметь дело с исключением всех этих файлов из синхронизации.
Итак, я хотел бы иметь что-то вроде этого:
path = '/var/lib/blob_files/'
file = open(path+'myfile.blob', 'w')
и получить файл в unix по адресу:
/var/lib/blob_files/myfile.blob
и в окнах по адресу:
C:\var\lib\blob_files\myfile.blob
он также может относиться к домашней папке пользователя (/home/user в unix и C:/Users/User в Windows), но я думаю, что проблема очень похожа.
Как я могу это достичь? есть ли какая-либо библиотека или функция, которые могут помочь мне прозрачно преобразовывать эти пути, не спрашивая, в какой платной форме работает сценарий все время?
Из двух моих опций, абсолютных от корня или родственника из домашней папки, какой из них вы рекомендуете использовать?
Заранее благодарим за любые советы по этому поводу.
Ответы
Ответ 1
Используйте os.path.abspath()
, а также os.path.expanduser()
для файлов, относящихся к домашнему каталогу пользователя:
print os.path.abspath("/var/lib/blob_files/myfile.blob")
>>> C:\var\lib\blob_files\myfile.blob
print os.path.abspath(os.path.expanduser("~/blob_files/myfile.blob"))
>>> C:\Users\jerry\blob_files\myfile.blob
Они будут "делать правильные вещи" для путей Windows и POSIX.
expanduser()
не изменит путь, если в нем нет ~
, поэтому вы можете безопасно использовать его со всеми путями. Таким образом, вы можете легко написать функцию обертки:
import os
def fixpath(path):
return os.path.abspath(os.path.expanduser(path))
Обратите внимание, что используемая буква диска будет диском, указанным текущим рабочим каталогом процесса Python, обычно находится каталог, в котором находится ваш script (при запуске из проводника Windows и при условии, что ваш script не изменяется Это). Если вы хотите заставить его всегда быть C:
, вы можете сделать что-то вроде этого:
import os
def fixpath(path):
path = os.path.normpath(os.path.expanduser(path))
if path.startswith("\\"): return "C:" + path
return path
Ответ 2
От ответа Blenders на Не зависящие от платформы пути к файлу?
>>> import os
>>> os.path.join('app', 'subdir', 'dir', 'filename.foo')
'app/subdir/dir/filename.foo'
Ответ 3
Хорошо, я получил ответ сам.
os.path.exists(os.path.abspath(filePath))
Может быть, это будет полезно для всех