如何获取 pathlib.Path 对象的绝对路径?

How to get absolute path of a pathlib.Path object?

使用 pathlib 模块创建路径对象,例如:

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

p 对象将指向文件系统中的某个文件,因为我可以这样做 p.read_text()

如何获取字符串中 p 对象的绝对路径?

似乎我可以使用例如 os.path.abspath(p) 来获取绝对路径,但是使用 os.path 方法很尴尬,因为我假设 pathlib 应该替代os.path.

您正在寻找方法 .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.

在我的系统上有一个测试文件 returns:

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

This method 似乎是对 PathPath 继承对象的新的 并且仍然是未记录的补充。

Created an issue to document this.

使用resolve()

只需像这样使用Path.resolve()

p = p.resolve()

这使您的路径成为绝对路径,并将所有相关部分替换为绝对部分,并将所有符号链接替换为物理路径。在不区分大小写的文件系统上,它还会规范化大小写(file.TXT 变为 file.txt)。

在 Python 3.11

之前避免 absolute()

在 Python 3.11 之前未记录或测试替代方法 absolute()(请参阅由@Jim Fasarakis Hilliard 创建的 the bug report 中的讨论)。

修复已合并 in January 2022

区别

resolveabsolute 的区别在于 absolute() 不会替换路径的符号链接 (symlink) 部分,并且它从不引发 FileNotFoundError。它也不修改大小写。

如果你想避免 resolve()(例如你想保留符号链接、大小写或相关部分),那么在 Python <3.11:

上使用它
p = Path.cwd() / "file.txt"

即使您提供的路径是绝对路径也能正常工作——在这种情况下 cwd(当前工作目录)将被忽略。

注意 Windows

上的不存在文件

如果文件不存在,在 Python 3.6 到 3.9 on Windows 中,resolve() 不添加当前工作目录。参见 issue 38671,已在 Python 3.10.

中修复

当心 FileNotFoundError

在 v3.6 之前的 Python 版本中,如果路径不在磁盘上,resolve() 引发 FileNotFoundError

因此,如果存在任何风险,请事先使用 p.exists() 或 try/catch 检查错误。

# 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 开始,如果您使用 strict 参数,resolve() 只会引发 FileNotFoundError

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

但请注意,使用 strict 会使您的代码与 3.6 之前的 Python 版本不兼容,因为这些版本不接受 strict 参数。

如果你只是想要路径,不想检查文件是否存在,你可以这样做

str(p)

作为 Operations 部分中的文档。

pathlib.Path.cwd() / p

这是 recommended by CPython core developers 作为 "one obvious way"。

p.resolve() 至少不会 return Windows 上不存在文件的绝对路径。

p.absolute() 未记录。