我正在将一些旧的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')
足以处理已有多个文件扩展名的情况,即使它对我来说不是很明显。
答案 0 :(得分:31)
我发现以下内容比已经给出的答案更令人满意:
new_path = path.parent / (path.name + '.suffix')
答案 1 :(得分:4)
Path看起来不像就地修改(您无法更改.parts[-1]
目录或更改.suffixes
等),但这并不意味着您需要求助太难了即使不是我想要的那么优雅,以下代码也能很好地工作:
new_path = (path.parent / path.name).with_suffix(path.suffix + new_suffix)
其中path
是您原始的Path变量,new_suffix
是带有新后缀/扩展名的字符串(包括前导“。”)
答案 2 :(得分:4)
您可能会使用pathlib3x-它提供了最新版本(在编写此答案的日期Python 3.10.a0)的反向端口,适用于Python 3.6或更高版本的Python pathlib,以及一些其他功能,例如append_suffix
>>> python -m pip install pathlib3x
>>> import pathlib3x as pathlib
>>> pathlib.Path('some_path').append_suffix('.ext')
PosixPath('some_path.ext')
>>> pathlib.Path('some_path.ext.ext2').append_suffix('.ext3')
PosixPath('some_path.ext.ext2.ext3')
免责声明:我是pathlib3x库的作者。
答案 3 :(得分:2)
您可以将Path
转换为字符串,然后添加新的扩展名并转换回Path
:
from pathlib import Path
first = Path("D:/user/file.xy")
print(first)
second = Path(str(first)+".res")
print(second)
答案 4 :(得分:0)
以下代码应以非常动态的方式完成您想要的操作。
from pathlib import Path
import time
p = Path('.')
p = p / '..' / 'Python' / 'Files' / 'Texts_to_read' / 'a_text_file'
new_p = str(p).split('\\')
new_suffix = '.txt'
new_p[-1] = new_p[-1] + new_suffix
p = Path('.')
for x in new_p:
p = p / x
print(new_p)
print(p)
print(str(p))
time.sleep(5)
在这种情况下可以使用正常的字符串操作是件好事,因为它无需增加大量新功能即可对所需的文件路径进行大量控制。
答案 5 :(得分:0)
如果您要附加文件名,但不更改扩展名,则可以使用
matfile2 = pathlib.Path.joinpath(matfile.parent, matfile.stem+' insert'+matfile.suffix)
答案 6 :(得分:0)
我认为这会更好,因为您只想使用任意字符串扩展当前路径。
old_path = Path("/the/old/path.foo") # "/the/old/path.foo"
new_path = Path(f"{old_path}.bar") # "/the/old/path.foo.bar"