120

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

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

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

我怎样才能得到的绝对路径p字符串中对象的绝对路径?

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

4

4 回答 4

197

利用resolve()

像这样简单地使用Path.resolve()

p = p.resolve()

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

避免absolute()

你不应该使用 absolute()它,因为它没有记录,未经测试,也没有考虑删除。(请参阅@Jim Fasarakis Hilliard 创建的错误报告中的讨论)。

区别

resolve和之间的区别在于absoluteabsolute()不会替换路径的符号链接(符号链接)部分,并且它永远不会 raise FileNotFoundError。它也没有修改案例。

如果您想避免resolve()(例如,您想保留符号链接、大小写或相关部分),请改用它:

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

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

注意 Windows 上不存在的文件

如果文件不存在,则在 Windows 上的 Python 3.6 到 3.9 中,resolve()不会将当前工作目录放在前面。请参阅问题 38671,已在 Python 3.10 中修复。

当心 FileNotFoundError

在 v3.6 之前的 Python 版本上,如果磁盘上不存在路径,resolve() 则确实会引发 a 。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()才会引发。FileNotFoundErrorstrict

# might raise FileNotFoundError
p = p.resolve(strict=True)

但请注意, usingstrict会使您的代码与 3.6 之前的 Python 版本不兼容,因为它们不接受该strict参数。

未来

关注问题 39090以关注与absolute().

于 2017-06-15T13:48:03.883 回答
80

如果我的理解正确,您正在寻找方法.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')

这种方法似乎是一种新的、仍然没有记录的对对象的添加Path和继承。Path

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

于 2017-02-28T15:52:59.347 回答
34

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

str(p)

作为操作部分中的文档。

于 2019-03-12T22:48:46.473 回答
8
pathlib.Path.cwd() / p

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

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

p.absolute()是无证的。

于 2019-11-04T10:46:23.757 回答