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

时间:2015-09-02 16:48:02

标签: 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

但无需诉诸os.path而无需输入str并返回Pathpth.resolve()也不适用于不存在的文件。

有一个简单的方法只用pathlib吗?

3 个答案:

答案 0 :(得分:13)

  

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

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

  

路径。的决心 (严格=假)
  ...
  如果strictFalse,则会尽可能地解析路径,并附加任何余数而不检查其是否存在

答案 1 :(得分:4)

从Python 3.5开始:不,没有。

PEP 0428州:

  

路径解析

     

resolve()方法使路径绝对,解析   路上的任何符号链接(如POSIX realpath()调用)。 是的   只有删除“..”路径组件的操作。在Windows上,   这种方法也会注意返回规范路径(使用   正确的套管)。

由于resolve()是删除“..”组件的唯一操作,并且当文件不存在时失败,因此不会有仅使用pathlib的简单方法。 / p>

此外,pathlib documentation提示了原因:

  

虚假斜线和单点折叠,但是双点('..')   不是,因为这会改变面对路径的意义   符号链接:

     

PurePath('foo//bar')生成PurePosixPath('foo/bar')

     

PurePath('foo/./bar')生成PurePosixPath('foo/bar')

     

PurePath('foo/../bar')生成PurePosixPath('foo/../bar')

     

一种天真的方法会使PurePosixPath('foo /../ bar')等同于PurePosixPath('bar'),如果foo是指向另一个目录的符号链接,则该错误)< / p>

所有这一切,你可以在路径的位置创建一个0字节的文件,然后就可以解析路径(从而消除了..)。不过,我不确定这比你的normpath方法更简单。

答案 2 :(得分:3)

如果这适合您使用(例如,ifle&#39; s目录已经存在),您可以尝试resolve路径的父级,然后重新附加文件名,例如:

from pathlib import Path

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