Как получить абсолютный путь к файлу в Python

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

"C:/example/cwd/mydir/myfile.txt"
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
823
0
1 015 326
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

Ответ принят как подходящий

>>> 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'

Примечание. На большинстве платформ это эквивалентно вызову функции normpath() следующим образом: normpath(join(os.getcwd(), path)). Поэтому, если mydir/myfile.txt не соответствует os.getcwd(), абсолютный путь - не настоящий путь.

coanor 25.11.2014 07:15

@coanor? Без явного корня mydir/myfile.txt неявно ссылается на путь внутри текущего рабочего каталога, что, следовательно, эквивалентно ./mydir/myfile.txt. Возможно, это не тот путь, который вы намеревались ввести, но, насколько я могу судить, это правильная интерпретация пути. Не могли бы вы уточнить?

jpmc26 09.01.2015 01:46

@ jpmc26 Я не совсем следую коанору, но я бы сказал, что (вопреки тому, что я предполагал), нет никакой связи между аргументом функции abspath и реальным файлом. Вы можете указать любое имя пути - несуществующие файлы и иерархии каталогов в порядке - и abspath просто разрешит биты пути (включая элемент родительского каталога "..") и вернет строку. Это просто строка, вычисленная из текущего каталога; Любое сопоставление с реальным файлом кажется случайным. Попробуйте os.path.abspath("/wow/junk/../blha/hooey"). Оно работает.

Mike S 12.09.2018 05:01

@MikeS Я, честно говоря, не понимаю, почему такое поведение может быть неожиданным. Это абсолютный дорожка, а не абсолютный файл или каталог. Если вам нужна проверка существования, позвоните в os.path.exists. Напротив, такие системы, как PowerShell, которые настаивают на существующем пути со стандартной функцией разрешения пути, являются проблемой в использовании.

jpmc26 12.09.2018 06:28

@ jpmc26 Предположение, что путь - это просто строка, которая выглядит как имя пути, совсем не ясно и противоречит тому, как я думал и говорил о путевых именах в течение многих лет. Я цитирую документы Python 3 для abspath: «Вернуть нормализованную абсолютизированную версию имени пути дорожка». Не "... версия нитьдорожка". Имя пути, как определено Posix, - это «строка, которая используется для идентификации файла». Документация Python явно говорит о relpath: «к файловой системе не осуществляется доступ для подтверждения существования или природы path». Если аргумент здесь очевиден, зачем быть явным для relpath?

Mike S 17.09.2018 21:07

@ jpmc26 ... чтобы еще больше запутать ситуацию, документы Python называют abspath «... эквивалентным вызову функции normpath () следующим образом: normpath(join(os.getcwd(), path))». который включает в себя системный вызов, который является ссылкой на реальное местоположение в файловой системе. Итак, опять же, у нас есть смешение идеи, что «это относится к чему-то (возможно) найденному в файловой системе» и «Это просто строка. Никакая идентификация с реальными файлами (живыми или умершими) не предполагается и не должна предполагаться. " Думаю, было бы лучше убрать ссылку на getcwd() и последовать примеру relpath.

Mike S 17.09.2018 21:14

@MikeS os.getcwd() не вызывает системный вызов на полном пути. явно просто извлекает строку из текущих настроек среды. Предоставление его значения необходимо, когда путь относительный, например если это './myfile.txt' или '../myfile.txt'. (Обратите внимание, что если path является абсолютным, то весь результат getcwd() полностью отбрасывается, даже.) Я не могу придумать никаких причин, по которым получение части состояния среды означало бы, что функция включает проверку существования полного пути.

jpmc26 17.09.2018 23:06

@ jpmc26 Вы правы, но я не это утверждаю. Забудьте про getcwd и перечитайте мой пост. Я хочу сказать: документация неточна. Они легко смешивают концепцию имени пути, являющегося истинным именем пути, вместо того, чтобы быть не чем иным, как строкой, которая может ссылаться на имя пути в файловой системе. В других местах документации они стараются указать на разницу, потому что она есть. Опять же, определение пути заключается не в том, что это простая строка. Аргумент abspath есть. Это мой последний комментарий; извиняюсь за то, что не торопились.

Mike S 18.09.2018 16:05

Установите сторонний модуль пути (находится на PyPI), он оборачивает все функции os.path и другие связанные функции в методы объекта, которые можно использовать везде, где используются строки:

>>> from path import path
>>> path('mydir/myfile.txt').abspath()
'C:\example\cwd\mydir\myfile.txt'

Жаль, что они так и не получили правильный модуль абстракции имени файла в stdlib.

Torsten Marek 26.09.2008 16:08

@ Торстен Марек: это болезненное и давнее упущение.

flow 12.02.2011 02:58

Теперь они сделали для Python 3.4: pathlib. Смотрите мой ответ в этой теме.

twasbrillig 24.10.2014 05:20

В этом ответе есть yypos. Это должно быть from path import Path, затем Path('mydir/myfile.txt').abspath()

frakman1 05.06.2017 17:51

Опечаток нет, возможно, вы использовали другой модуль path. Связанный модуль использует класс path.

Tom 07.06.2017 02:42

Сегодня вы также можете использовать пакет 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)

NuclearPeon 31.08.2015 19:14

Согласно моему эксперименту, на оконной платформе resolve() возвращает вам полный путь только в том случае, если он способен к файлу resolve(). Но os.path.abspath все равно возвращает вам полный путь, даже если файл не существует. Однако в Linux он всегда возвращает абсолютный путь

Mond Wan 31.07.2020 12:04

Почему это происходит, когда только Path(__file__) (без метода разрешения) используется в модуле, импортируемом вместе с пакетом, дает абсолютный путь вместо относительного пути?

aderchox 08.08.2020 11:50

если вы на Mac

import os
upload_folder = os.path.abspath("static/img/users")

это даст вам полный путь:

print(upload_folder)

покажет следующий путь:

>>>/Users/myUsername/PycharmProjects/OBS/static/img/user

Идентичен принятому ответу, за исключением того, что он пришел с опозданием на 10 лет.

wim 05.10.2020 02:29

Если кто-то использует 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'

Комбинируя "/.." с другими именами файлов, вы можете получить доступ к любому файлу в системе.

Спрашивали не об этом. Они спросили о пути по отношению к текущему рабочему каталогу, который не совпадает с каталогом сценария, хотя иногда они могут иметь такое же значение.

The Elemental of Destruction 23.05.2019 07:16

import os
os.path.abspath(os.path.expanduser(os.path.expandvars(PathNameString)))

Обратите внимание, что expanduser необходим (в Unix) в случае, если данное выражение для имени и местоположения файла (или каталога) может содержать начальный ~/ (тильда относится к домашнему каталогу пользователя), а expandvars заботится о любых других переменных среды ( как $HOME).

Другие вопросы по теме