pathlib
使用如下模块创建路径对象:
p = pathlib.Path('file.txt')
这p
对象将指向文件系统中的某个文件,因为我可以做例如p.read_text()
.
我怎样才能得到的绝对路径p
字符串中对象的绝对路径?
似乎我可以使用例如os.path.abspath(p)
获取绝对路径,但使用os.path
方法很尴尬,因为我认为这pathlib
应该是os.path
.
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()
这使您的路径成为绝对路径,并将所有相对部分替换为绝对部分,并将所有符号链接替换为物理路径。在不区分大小写的文件系统上,它还将规范化大小写(file.TXT
变成file.txt
)。
absolute()
你不应该使用 absolute()
它,因为它没有记录,未经测试,也没有考虑删除。(请参阅@Jim Fasarakis Hilliard 创建的错误报告中的讨论)。
resolve
和之间的区别在于absolute
它absolute()
不会替换路径的符号链接(符号链接)部分,并且它永远不会 raise FileNotFoundError
。它也没有修改案例。
如果您想避免resolve()
(例如,您想保留符号链接、大小写或相关部分),请改用它:
p = Path.cwd() / "file.txt"
即使您提供的路径是绝对路径,这也有效——在这种情况下,cwd
(当前工作目录)将被忽略。
如果文件不存在,则在 Windows 上的 Python 3.6 到 3.9 中,resolve()
不会将当前工作目录放在前面。请参阅问题 38671,已在 Python 3.10 中修复。
在 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()
才会引发。FileNotFoundError
strict
# might raise FileNotFoundError
p = p.resolve(strict=True)
但请注意, usingstrict
会使您的代码与 3.6 之前的 Python 版本不兼容,因为它们不接受该strict
参数。
关注问题 39090以关注与absolute()
.
如果我的理解正确,您正在寻找方法.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
pathlib.Path.cwd() / p
这是CPython 核心开发人员推荐的“一种显而易见的方式”。
p.resolve()
至少不会为 Windows 上不存在的文件返回绝对路径。
p.absolute()
是无证的。