使用resolve()
像这样简单地使用Path.resolve():
p = p.resolve()
这使您的路径成为绝对路径,并将所有相对部分替换为绝对部分,并将所有符号链接替换为物理路径。在不区分大小写的文件系统上,它还将规范化大小写(file.TXT 变为 file.txt)。
避免absolute()
您不应该使用 absolute(),因为它没有记录,未经测试,也没有考虑删除。 (参见@Jim Fasarakis Hilliard 创建的the bug report 中的讨论)。
区别
resolve 和absolute 之间的区别在于absolute() 不会替换路径的符号链接(符号链接)部分,并且它永远不会引发FileNotFoundError。它也不修改大小写。
如果您想避免resolve()(例如,您想保留符号链接、大小写或相关部分),请改用它:
p = Path.cwd() / "file.txt"
即使您提供的路径是绝对路径,这仍然有效——在这种情况下,cwd(当前工作目录)将被忽略。
注意 Windows 上不存在的文件
如果文件不存在,在 Windows 上的 Python 3.6 到 3.9 中,resolve() 不会在当前工作目录前添加。请参阅issue 38671,已在 Python 3.10 中修复。
小心 FileNotFoundError
在 v3.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 参数。
未来
关注issue 39090 以关注与absolute() 相关的文档更改。