仅使用pathlib规范化不存在的路径

hir*_*ist 18 python python-3.x python-3.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
Run Code Online (Sandbox Code Playgroud)

但无需诉诸os.path和不必输入str和返回Path.也pth.resolve()不会为不存在的文件.

有一个简单的方法pathlib吗?

ent*_*nto 15

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

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

路径.resolve (strict = False)
...
如果strictFalse,则尽可能地解析路径,并附加任何余数而不检查它是否存在

  • 事实上,这与 os.path.normpath() 并不完全相同!首先,它将路径转换为绝对路径(如果可能)。其次,它解析符号链接(如果可能)! (3认同)

Bry*_*ant 8

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