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

标签 python python-3.x pathlib

使用 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 的区别和 absoluteabsolute()不会替换路径的符号链接(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/

相关文章:

python - "python"virtualenv activate后仍然运行系统版本

javascript - 选择 flask 后不显示下拉选择的值?

python - 读取 MIDI 文件时十六进制到整数

python-3.x - 将 BERTopic 主题 ID 映射回训练数据框

Python 返回 "wrong"退出代码

python - Python 如何处理不可打印字符?

python - django如何异步执行函数,即将任务移交给子进程并返回响应

python - 如何在python中获取兄弟文件夹路径?

python - 如何将任何目录格式(windows、linux、mac)传递给函数并独立使用它(python3)

python - 如何修改 `pathlib.Path` 的行为?