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

新手上路,请多包涵

使用 pathlib 模块制作路径对象,例如:

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

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

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

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

原文由 EquipDev 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

您正在寻找方法 .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 对象的新的、但仍未记录的补充。

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

原文由 Dimitris Fasarakis Hilliard 发布,翻译遵循 CC BY-SA 4.0 许可协议

使用 resolve()

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

 p = p.resolve()

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

在 Python 3.11 之前避免 absolute()

替代方法 absolute() 在 Python 3.11 之前没有记录或测试(请参阅@Jim Fasarakis Hilliard 创建 的错误报告 中的讨论)。

修复 于 2022 年 1 月 合并。

区别

The difference between resolve and absolute is that absolute() does not replace the symbolically linked (symlink) parts of the path, and it never raises FileNotFoundError 。它也不修改大小写。

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

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

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

当心 Windows 上不存在的文件

如果该文件不存在,在 Windows 上的 Python 3.6 到 3.9 中, resolve() 不会添加当前工作目录。请参阅 问题 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 参数。

原文由 florisla 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题