Создание объекта пути с помощью модуля pathlib, например:

p = pathlib.Path('file.txt')

Объект p будет указывать на какой-то файл в файловой системе, так как я могу, например, p.read_text ().

Как я могу получить абсолютный путь к объекту p в строке?

Похоже, что я могу использовать, например, os.path.abspath (p), чтобы получить абсолютный путь, но неудобно использовать метод os.path, поскольку я предполагаю этот pathlib должен заменить os.path.

EquipDev

Ответов: 4

Ответы (4)

Вы ищете метод .absolute, если я правильно понимаю, в документации которого указано:

>>> print(p.absolute.__doc__)
Return an absolute version of this path.  This function works
        even if the path doesn't point to anything.

        No normalization is done, i.e. all '.' and '..' will be kept along.
        Use resolve() to get the canonical path to a file.

С тестовым файлом в моей системе это возвращает:

>>> p = pathlib.Path('testfile')
>>> p.absolute()
PosixPath('/home/jim/testfile')

Этот метод кажется новым, и все еще недокументированным дополнением к Path и Path, наследующим объектам.

Создана проблема, чтобы задокументировать это.

Используйте resolve ()

Просто используйте Path.resolve () вот так:

p = p.resolve()

Это делает ваш путь абсолютным и заменяет все относительные части абсолютными частями, а все символические ссылки физическими путями. В файловых системах без учета регистра регистр также будет канонизирован (file.TXT становится file.txt).

Избегать absolute ()

Вам не следует использовать absolute (), потому что он не задокументирован, не протестирован и не рассматривается для удаления. (См. Обсуждение в отчете об ошибке, созданном @Jim Fasarakis Hilliard).

Разница

Разница между resolve и absolute заключается в том, что absolute () не заменяет символически связанные (символические ссылки) части пути и никогда не вызываетFileNotFoundError. Не меняет и регистр.

Если вы хотите избежать resolve () (например, вы хотите сохранить символические ссылки, регистр или относительные части), используйте вместо этого:

p = Path.cwd() / "file.txt"

Остерегайтесь несуществующего файла в Windows

Если файл не существует, в Python 3.6–3.9 в Windows resolve () не добавляет текущий рабочий каталог в начало. См. Проблему 38671, исправленную в Python 3.10.

Остерегайтесь FileNotFoundError

В версиях Python, предшествующих v3.6, resolve () вызывает ошибку FileNotFoundError, если путь отсутствует на диске.

Так что, если есть какой-либо риск, либо проверьте заранее с помощью p.exists (), либо попробуйте / отловите ошибку.

# check beforehand
if p.exists():
    p = p.resolve()

# or except afterward
try:
    p = p.resolve()
except FileNotFoundError:
    # deal with the missing file here
    pass

Если вы имеете дело с путем, которого нет на диске, для начала, и вы не используете Python 3.6+, лучше вернуться к os.path.abspath (str (p)).

Начиная с версии 3.6, resolve () вызывает только FileNotFoundError, если вы используете аргумент strict.

# might raise FileNotFoundError
p = p.resolve(strict=True)

Но будьте осторожны, использование strict делает ваш код несовместимым с версиями Python, предшествующими 3.6, поскольку они не принимают аргумент strict.

Будущее

Следуйте issue 39090, чтобы следить за изменениями документации, относящимися к absolute ().

Если вам просто нужен путь и вы не хотите проверять, существует ли файл, вы можете сделать

str(p)

as document in the Operations section.

pathlib.Path.cwd() / p

Это , рекомендованное разработчиками ядра CPython как «один очевидный способ».

p.resolve () не возвращает абсолютный путь для несуществующих файлов в Windows по крайней мере.

p.absolute () недокументирован.

2022 WebDevInsider