【发布时间】:2018-03-20 09:31:41
【问题描述】:
我将一些旧的 Python 代码转换为使用 pathlib 而不是 os.path 进行大多数与路径相关的操作,但我最终遇到了以下问题:我需要向已经有扩展名的路径添加另一个扩展名(不是替换它)。使用os.path,由于我们只是在操作字符串,解决方案是添加带有字符串操作的扩展:
newpath = path + '.res'
它不适用于pathlib.Path,因为它不允许连接任意字符。我能找到的最接近的是:
newpath = path.with_suffix(path.suffix + '.res')
这看起来像是一种解决方法,因为它最后仍然使用字符串添加。而且它有一个新的陷阱,因为我一开始忘记处理已经有几个扩展并且你想添加一个新的情况,导致下面的代码恢复旧的行为:
newpath = path.with_suffix(''.join(path.suffixes) + '.res')
现在感觉既不简洁也不干净,因为它使用越来越多的字符串操作来实现旧的行为,而不是纯粹的路径操作。 Path.suffixes 存在的事实意味着库的开发人员考虑了文件可以具有多个扩展名的情况,但我找不到简单地将新扩展名添加到路径的方法。有没有更惯用的方式来实现相同的行为?
编辑:实际上path.with_suffix(path.suffix + '.res') 足以处理已经有多个文件扩展名的情况,即使它对我来说并不是很明显。
【问题讨论】:
-
在发布我的答案后才看到您的编辑......这似乎也是一个很好的解决方案
-
似乎没有比您已经拥有的单线更好的答案了。 pathlib 似乎有一些非常烦人的致命缺陷,使其比普通字符串更难使用——例如,如果你想在你的方法中添加后缀
_foo.res,你会得到ValueError: Invalid suffix,因为它没有不要以点开头! -
应该选择一个答案...
-
@MadPhysicist 如果我认为有一个好的答案,我会这样做,但正如提到
pathlib3x的答案所证明的那样,标准库中没有一个干净的解决方案(而且我没有想要为整个库添加一个新的依赖项),虽然一些提议的替代方案是有效的,但没有一个让人感到满意。我宁愿让大众选择他们最喜欢的答案。 -
@Morwenn。同时,您的问题在未回答的队列中徘徊,而一些倒霉的人缺少他们的 15 分
标签: python python-3.x pathlib