如何得到路径对象的绝对路径?

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

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

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

如何得到字符串中 p对象的绝对路径?

看起来我可以使用例如 os.path.abspath(p)来获得绝对路径,但是使用 os.path方法比较麻烦,因为我假设 pathlib应该是 os.path的替代品。

158815 次浏览

如果我的理解正确的话,你正在寻找 .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')

这个方法 似乎是对 PathPath继承对象的一个新的、 < strike > 和仍然未记录的添加。

创建了一个问题来记录这个

使用 resolve()

像这样简单地使用 Path.resolve():

p = p.resolve()

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

在 Python 3.11之前避免使用 absolute()

在 Python 3.11之前,没有对替代方法 absolute()进行记录或测试(请参阅由@Jim Fasarakis Hilliard 创建的 漏洞报告中的讨论)。

修复程序被合并为 2022年1月

区别在于

resolveabsolute的不同之处在于,absolute()不会替换路径中符号链接(symlink)部分,也不会引发 FileNotFoundError。它也没有修改案例。

如果您希望避免使用 resolve()(例如,希望保留符号链接、大小写或相关部分) ,那么可以在 Python < 3.11上使用它:

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

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

小心 Windows 上不存在的文件

如果该文件不存在,在 Python 3.6-3.9的 Windows 系统中,abc0不会预先设置当前的工作目录。请参阅在 Python 3.10中修复的 第38671期

注意 FileNotFoundError

在3.6版本之前的 Python 版本中,如果磁盘上没有路径,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开始,如果使用 strict参数,resolve()仅引发 FileNotFoundError

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

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

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

str(p)

作为 行动中心部分的文档。

pathlib.Path.cwd() / p

这是 由 CPython 核心开发人员推荐作为“一个显而易见的方式”。

至少对于 Windows 上不存在的文件,p.resolve()不返回绝对路径。

p.absolute()是非法的。