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
吗?
答案 0 :(得分:13)
是否可以规范化不存在的文件或目录的路径?
从3.6开始,这是默认行为。见https://docs.python.org/3.6/library/pathlib.html#pathlib.Path.resolve
路径。的决心强> (严格=假)
...
如果strict
为False
,则会尽可能地解析路径,并附加任何余数而不检查其是否存在
答案 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)