Учитывая такой путь, как "mydir/myfile.txt", как мне найти абсолютный путь к файлу относительно текущего рабочего каталога в Python? Например. в Windows я могу получить:
"C:/example/cwd/mydir/myfile.txt"






>>> import os
>>> os.path.abspath("mydir/myfile.txt")
'C:/example/cwd/mydir/myfile.txt'
Также работает, если это уже абсолютный путь:
>>> import os
>>> os.path.abspath("C:/example/cwd/mydir/myfile.txt")
'C:/example/cwd/mydir/myfile.txt'
@coanor? Без явного корня mydir/myfile.txt неявно ссылается на путь внутри текущего рабочего каталога, что, следовательно, эквивалентно ./mydir/myfile.txt. Возможно, это не тот путь, который вы намеревались ввести, но, насколько я могу судить, это правильная интерпретация пути. Не могли бы вы уточнить?
@ jpmc26 Я не совсем следую коанору, но я бы сказал, что (вопреки тому, что я предполагал), нет никакой связи между аргументом функции abspath и реальным файлом. Вы можете указать любое имя пути - несуществующие файлы и иерархии каталогов в порядке - и abspath просто разрешит биты пути (включая элемент родительского каталога "..") и вернет строку. Это просто строка, вычисленная из текущего каталога; Любое сопоставление с реальным файлом кажется случайным. Попробуйте os.path.abspath("/wow/junk/../blha/hooey"). Оно работает.
@MikeS Я, честно говоря, не понимаю, почему такое поведение может быть неожиданным. Это абсолютный дорожка, а не абсолютный файл или каталог. Если вам нужна проверка существования, позвоните в os.path.exists. Напротив, такие системы, как PowerShell, которые настаивают на существующем пути со стандартной функцией разрешения пути, являются проблемой в использовании.
@ jpmc26 Предположение, что путь - это просто строка, которая выглядит как имя пути, совсем не ясно и противоречит тому, как я думал и говорил о путевых именах в течение многих лет. Я цитирую документы Python 3 для abspath: «Вернуть нормализованную абсолютизированную версию имени пути дорожка». Не "... версия нитьдорожка". Имя пути, как определено Posix, - это «строка, которая используется для идентификации файла». Документация Python явно говорит о relpath: «к файловой системе не осуществляется доступ для подтверждения существования или природы path». Если аргумент здесь очевиден, зачем быть явным для relpath?
@ jpmc26 ... чтобы еще больше запутать ситуацию, документы Python называют abspath «... эквивалентным вызову функции normpath () следующим образом: normpath(join(os.getcwd(), path))». который включает в себя системный вызов, который является ссылкой на реальное местоположение в файловой системе. Итак, опять же, у нас есть смешение идеи, что «это относится к чему-то (возможно) найденному в файловой системе» и «Это просто строка. Никакая идентификация с реальными файлами (живыми или умершими) не предполагается и не должна предполагаться. " Думаю, было бы лучше убрать ссылку на getcwd() и последовать примеру relpath.
@MikeS os.getcwd() не вызывает системный вызов на полном пути. явно просто извлекает строку из текущих настроек среды. Предоставление его значения необходимо, когда путь относительный, например если это './myfile.txt' или '../myfile.txt'. (Обратите внимание, что если path является абсолютным, то весь результат getcwd() полностью отбрасывается, даже.) Я не могу придумать никаких причин, по которым получение части состояния среды означало бы, что функция включает проверку существования полного пути.
@ jpmc26 Вы правы, но я не это утверждаю. Забудьте про getcwd и перечитайте мой пост. Я хочу сказать: документация неточна. Они легко смешивают концепцию имени пути, являющегося истинным именем пути, вместо того, чтобы быть не чем иным, как строкой, которая может ссылаться на имя пути в файловой системе. В других местах документации они стараются указать на разницу, потому что она есть. Опять же, определение пути заключается не в том, что это простая строка. Аргумент abspath есть. Это мой последний комментарий; извиняюсь за то, что не торопились.
Установите сторонний модуль пути (находится на PyPI), он оборачивает все функции os.path и другие связанные функции в методы объекта, которые можно использовать везде, где используются строки:
>>> from path import path
>>> path('mydir/myfile.txt').abspath()
'C:\example\cwd\mydir\myfile.txt'
Жаль, что они так и не получили правильный модуль абстракции имени файла в stdlib.
@ Торстен Марек: это болезненное и давнее упущение.
Теперь они сделали для Python 3.4: pathlib. Смотрите мой ответ в этой теме.
В этом ответе есть yypos. Это должно быть from path import Path, затем Path('mydir/myfile.txt').abspath()
Опечаток нет, возможно, вы использовали другой модуль path. Связанный модуль использует класс path.
Сегодня вы также можете использовать пакет unipath, основанный на path.py: http://sluggo.scrapping.cc/python/unipath/
>>> from unipath import Path
>>> absolute_path = Path('mydir/myfile.txt').absolute()
Path('C:\example\cwd\mydir\myfile.txt')
>>> str(absolute_path)
C:\example\cwd\mydir\myfile.txt
>>>
Я бы рекомендовал использовать этот пакет, поскольку он предлагает чистый интерфейс для общих утилит os.path.
Вы можете использовать новую библиотеку Python 3.4 pathlib. (Вы также можете получить ее для Python 2.6 или 2.7, используя pip install pathlib.) Авторы написал: «Цель этой библиотеки - предоставить простую иерархию классов для обработки путей файловой системы и обычных операций, выполняемых пользователями над ними».
Чтобы получить абсолютный путь в Windows:
>>> from pathlib import Path
>>> p = Path("pythonw.exe").resolve()
>>> p
WindowsPath('C:/Python27/pythonw.exe')
>>> str(p)
'C:\Python27\pythonw.exe'
Или в UNIX:
>>> from pathlib import Path
>>> p = Path("python3.4").resolve()
>>> p
PosixPath('/opt/python3/bin/python3.4')
>>> str(p)
'/opt/python3/bin/python3.4'
Документы здесь: https://docs.python.org/3/library/pathlib.html
Очень полезно. Использование os.path.abspath() дало мне ошибку: AttributeError: 'NoneType' object has no attribute 'startswith', использование Path().resolve() не имеет того же относительного пути к файлу. (Linux и Python3.4)
Согласно моему эксперименту, на оконной платформе resolve() возвращает вам полный путь только в том случае, если он способен к файлу resolve(). Но os.path.abspath все равно возвращает вам полный путь, даже если файл не существует. Однако в Linux он всегда возвращает абсолютный путь
Почему это происходит, когда только Path(__file__) (без метода разрешения) используется в модуле, импортируемом вместе с пакетом, дает абсолютный путь вместо относительного пути?
если вы на Mac
import os
upload_folder = os.path.abspath("static/img/users")
это даст вам полный путь:
print(upload_folder)
покажет следующий путь:
>>>/Users/myUsername/PycharmProjects/OBS/static/img/user
Идентичен принятому ответу, за исключением того, что он пришел с опозданием на 10 лет.
Если кто-то использует python и linux и ищет полный путь к файлу:
>>> path=os.popen("readlink -f file").read()
>>> print path
abs/path/to/file
Обновление для Python 3.4+ pathlib, которое фактически отвечает на вопрос:
from pathlib import Path
relative = Path("mydir/myfile.txt")
absolute = relative.absolute() # absolute is a Path object
Если вам нужна только временная строка, имейте в виду, что вы можете использовать объекты Path со всеми соответствующими функциями в os.path, включая, конечно, abspath:
from os.path import abspath
absolute = abspath(relative) # absolute is a str object
Этот всегда получает правильное имя файла текущего сценария, даже когда он вызывается из другого сценария. Это особенно полезно при использовании subprocess.
import sys,os
filename = sys.argv[0]
оттуда вы можете получить полный путь к скрипту с помощью:
>>> os.path.abspath(filename)
'/foo/bar/script.py'
Это также упрощает навигацию по папкам, просто добавляя /.. столько раз, сколько вы хотите, чтобы подняться «вверх» в иерархии каталогов.
Чтобы получить cwd:
>>> os.path.abspath(filename+"/..")
'/foo/bar'
Для родительского пути:
>>> os.path.abspath(filename+"/../..")
'/foo'
Комбинируя "/.." с другими именами файлов, вы можете получить доступ к любому файлу в системе.
Спрашивали не об этом. Они спросили о пути по отношению к текущему рабочему каталогу, который не совпадает с каталогом сценария, хотя иногда они могут иметь такое же значение.
import os
os.path.abspath(os.path.expanduser(os.path.expandvars(PathNameString)))
Обратите внимание, что expanduser необходим (в Unix) в случае, если данное выражение для имени и местоположения файла (или каталога) может содержать начальный ~/ (тильда относится к домашнему каталогу пользователя), а expandvars заботится о любых других переменных среды ( как $HOME).
Примечание. На большинстве платформ это эквивалентно вызову функции
normpath()следующим образом:normpath(join(os.getcwd(), path)). Поэтому, еслиmydir/myfile.txtне соответствуетos.getcwd(), абсолютный путь - не настоящий путь.