Как получить абсолютный путь объекта pathlib.Path?

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

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

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

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

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

Ответ 1

Вы ищете метод .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.

Создал проблему для документирования этого.

Ответ 2

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

Просто используйте Path.resolve() следующим образом:

p = p.resolve()

Это делает ваш путь абсолютным и заменяет все относительные части абсолютными частями.

Избегайте абсолютных()

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

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

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

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

Поэтому, если есть риск для этого, либо проверьте beforhand с p.exists() либо попробуйте/поймайте ошибку.

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

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

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

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

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

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

Ответ 3

Вы можете использовать .absolute() (которая, как ни странно, кажется, не документирована), чтобы сделать ваш путь абсолютным, а затем str для преобразования его в строку:

str(p.absolute())

Ответ 4

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

str(p)

как документ в разделе операций.