python 最近添加了 pathlib 模块(我非常喜欢!)。
我只有一件事正在努力解决:是否可以规范化不存在的文件或目录的路径?我可以用
os.path.normpath
完美地做到这一点。但是,必须使用除库之外的其他东西来处理与路径相关的内容,这不是很荒谬吗?
我想要的功能是这样的:
from os.path import normpath
from pathlib import Path
pth = Path('/tmp/some_directory/../i_do_not_exist.txt')
pth = Path(normpath(str(pth)))
# -> /tmp/i_do_not_exist.txt
但不必求助于
os.path
,也不必类型转换为 str
然后返回 Path
。另外 pth.resolve()
不适用于不存在的文件。
有没有一种简单的方法只需
pathlib
就能做到这一点?
是否可以规范化不存在的文件或目录的路径?
从 3.6 开始,这是默认行为。请参阅https://docs.python.org/3.6/library/pathlib.html#pathlib.Path.resolve
路径。解决(严格=False)
...
如果是strict
,则尽可能解析路径,并附加任何剩余部分,而不检查其是否存在False
从 Python 3.5 开始:不,没有。
PEP 0428 指出:
路径分辨率
resolve() 方法使路径成为绝对路径,解析 途中的任何符号链接(如 POSIX realpath() 调用)。 这是 唯一会删除“..”路径组件的操作。在 Windows 上, 此方法还将注意返回规范路径(带有 右壳)。
由于
resolve()
是唯一删除“..”组件的操作,并且当文件不存在时会失败,因此不会有仅使用 pathlib
的简单方法。
此外,pathlib 文档给出了原因的提示:
虚假斜线和单点被折叠,但双点('..') 不是,因为这会改变路径的含义 符号链接:
产生PurePath('foo//bar')
PurePosixPath('foo/bar')
产生PurePath('foo/./bar')
PurePosixPath('foo/bar')
产生PurePath('foo/../bar')
PurePosixPath('foo/../bar')
(幼稚的方法会使 PurePosixPath('foo/../bar') 等同于 PurePosixPath('bar'),如果 foo 是到另一个目录的符号链接,这是错误的)
综上所述,您可以在路径位置创建一个 0 字节文件,然后就可以解析该路径(从而消除 ..)。不过,我不确定这比您的标准路径方法更简单。
如果这适合您的用例(例如,如果目录已经存在),您可以尝试
resolve
路径的父级,然后重新附加文件名,例如:
from pathlib import Path
p = Path() / "hello.there"
print(p.parent.resolve() / p.name)
老问题,但这里有另一个解决方案,特别是如果您想要全面的 POSIX 路径(也像 Windows 上的 nix 路径)。 我发现 pathlib
resolve()
从 Python 3.10 开始就被破坏了,而且这个方法目前还没有被 PurePosixPath
公开。
我发现有效的是使用
posixpath.normpath()
。还发现PurePosixPath.joinpath()
坏了。 IE。它不会按预期将“..”与“myfile.txt”连接起来。它只会返回“myfile.txt”。但是 posixpath.join()
工作得很好;将返回“../myfile.txt”。
注意这是在路径字符串中,但很容易回到 OOP 容器的
pathlib.Path(my_posix_path)
等人。
通过这种方式构建,也可以轻松转换到 Windows 平台路径,因为该模块会为您处理平台独立性。
对于其他有 Python 文件路径问题的人来说可能是解决方案..