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

Equ*_*Dev 32 python python-3.x pathlib

使用以下pathlib模块创建路径对象:

p = pathlib.Path('file.txt')
Run Code Online (Sandbox Code Playgroud)

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

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

似乎我可以使用例如os.path.abspath(p)获取绝对路径,但使用os.path方法很难,因为我认为pathlib应该替代os.path.

flo*_*sla 68

使用resolve()

只需使用Path.resolve(),如下所示:

p = p.resolve()
Run Code Online (Sandbox Code Playgroud)

这使您的路径绝对,并用绝对部分替换所有相对部分.

避免绝对()

您不应该使用 absolute()(几乎相同),因为它没有记录,未经测试,并考虑删除.(参见@Jim Fasarakis Hilliard创建的错误报告中的讨论).

不同之处在于absolute()不会替换路径的相对部分,并且永远不会提升FileNotFoundError.

注意FileNotFoundError

在Python版本早于V3.6,resolve() 提出一个FileNotFoundError如果路径不存在在磁盘上.

因此,如果存在任何风险,请检查beforhand with p.exists()或try/catch错误.

# check beforehand
if p.exists():
    p = p.resolve()

# or catch afterward
try:
    p = p.resolve()
catch FileNotFoundError:
    # deal with the missing file here
    pass
Run Code Online (Sandbox Code Playgroud)

如果您正在处理一个不在磁盘上的路径,并且您没有使用Python 3.6+,那么最好还原到os.path.abspath(str(p)).

从3.6开始,resolve()如果使用strict参数,则仅引发FileNotFoundError .

# might raise FileNotFoundError
p = p.resolve(strict=True)
Run Code Online (Sandbox Code Playgroud)

但请注意,使用strict会使您的代码与3.6之前的Python版本不兼容,因为那些不接受该参数.

  • 根据合并的最新 PR (https://github.com/python/cpython/pull/26153),您关于“绝对”即将消失并且应该避免的论点不再准确。它提供了一种独特的“解决”行为,并且该线程的最新评论中没有迹象表明它将被删除。 (3认同)

Jim*_*ard 33

你正在寻找这种方法.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.
Run Code Online (Sandbox Code Playgroud)

使用我的系统上的测试文件,它返回:

>>> p = pathlib.Path('testfile')
>>> p.absolute()
PosixPath('/home/jim/testfile')
Run Code Online (Sandbox Code Playgroud)

这个方法似乎是一个新的,仍然没有文档的添加PathPath继承对象.

创建了一个记录此问题的问题.

  • 当然,接受的答案是答案**绝对没有人应该使用。**另请参阅[唯一理智的答案,它准确记录了为什么会出现这种情况](/sf/answers/3119847461/ )。 (9认同)

Vee*_*ech 30

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

str(p)
Run Code Online (Sandbox Code Playgroud)

作为操作部分中的文档。

  • 主题启动器要求**绝对**路径,您无法从使用相对路径初始化的“Path”对象中获取它 (8认同)
  • 很好奇为什么会对此投赞成票。我欢迎其他评论提供更多解释。`str(pathlib.Path('.'))` 返回 `'.'`。作为获取绝对路径的通用解决方案,这种行为似乎没有什么帮助。 (2认同)

Pet*_*ter 8

pathlib.Path.cwd() / p
Run Code Online (Sandbox Code Playgroud)

这是CPython 核心开发人员推荐的“一种明显的方式”。

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

p.absolute() 是无证的。

  • 嗯,它是由**一位** CPython 核心开发人员推荐的(并且受到另一位开发人员的争议,因为不那么明显)。此外,在同一页面上,[证明](https://discuss.python.org/t/pathlib-absolute-vs-resolve/2573/15)该解决方案并不总是产生绝对路径。它适用于大多数情况,但并非万无一失。 (2认同)