仅使用pathlib标准化不存在的路径

问题描述 投票:0回答:4

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
就能做到这一点?

python python-3.x python-3.4
4个回答
26
投票

是否可以规范化不存在的文件或目录的路径?

从 3.6 开始,这是默认行为。请参阅https://docs.python.org/3.6/library/pathlib.html#pathlib.Path.resolve

路径。解决(严格=False)
...
如果

strict
False
,则尽可能解析路径,并附加任何剩余部分,而不检查其是否存在


9
投票

从 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 字节文件,然后就可以解析该路径(从而消除 ..)。不过,我不确定这比您的标准路径方法更简单。


3
投票

如果这适合您的用例(例如,如果目录已经存在),您可以尝试

resolve
路径的父级,然后重新附加文件名,例如:

from pathlib import Path

p = Path() / "hello.there"
print(p.parent.resolve() / p.name)

-1
投票

老问题,但这里有另一个解决方案,特别是如果您想要全面的 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 文件路径问题的人来说可能是解决方案..

© www.soinside.com 2019 - 2024. All rights reserved.