使用 pathlib
模块创建路径对象,例如:
p = pathlib.Path('file.txt')
p
对象将指向文件系统中的某个文件,因为我可以这样做,例如 p.read_text()
。
如何获取字符串中p
对象的绝对路径?
似乎我可以使用例如 os.path.abspath(p)
来获取绝对路径,但是使用 os.path
方法很尴尬,因为我假设 pathlib
应该是 os.path
的替代品。
最佳答案
使用 resolve()
只需使用 Path.resolve()
像这样:
p = p.resolve()
这使您的路径成为绝对路径,并将所有相对部分替换为绝对部分,并将所有符号链接(symbolic link)替换为物理路径。在不区分大小写的文件系统上,它还将规范化大小写(file.TXT
变为 file.txt
)。
避免absolute()
Python 3.11 之前
替代方法absolute()
在 Python 3.11 之前没有记录或测试(参见由 @Jim Fasarakis Hilliard 创建的 the bug report 中的讨论)。
修复已合并 in January 2022 .
区别
resolve
的区别和 absolute
是absolute()
不会替换路径的符号链接(symbolic link)(符号链接(symbolic link))部分,并且它永远不会引发 FileNotFoundError
.它也不修改大小写。
如果你想避开 resolve()
(例如,您想保留符号链接(symbolic link)、大小写或相关部分)然后在 Python <3.11 上使用它:
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 开始,resolve()
只加注 FileNotFoundError
如果您使用 strict
论据。
# might raise FileNotFoundError
p = p.resolve(strict=True)
但请注意,使用 strict
使您的代码与 3.6 之前的 Python 版本不兼容,因为那些不接受 strict
论据。
关于python - 如何获取 pathlib.Path 对象的绝对路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42513056/