TLDR:
在我看来,替换所有扩展的最佳方法如下。
import pathlib
p = pathlib.Path('/path/to.my/file.foo.bar.baz.quz')
print(p.with_name(p.name.split('.')[0]).with_suffix('.jpg'))
再答:
最好的方法取决于你的python版本以及你需要处理多少扩展。也就是说,我很惊讶没有人提到pathlib的with_name。我还担心这里的一些答案不处理。在父目录中。以下是完成扩展替换的几种方法。
使用路径对象
更换最多一个分机
import pathlib
p = pathlib.Path('/path/to.my/file.foo')
print(p.with_suffix('.jpg'))
最多更换两个分机
import pathlib
p = pathlib.Path('/path/to.my/file.foo.bar')
print(p.with_name(p.stem).with_suffix('.jpg'))
更换所有扩展
使用pathlibs with_name(在我看来,最好的解决方案):
import pathlib
p = pathlib.Path('/path/to.my/file.foo.bar.baz.quz')
print(p.with_name(p.name.split('.')[0]).with_suffix('.jpg'))
使用functools。Reduce和pathlib的with_suffix:
import pathlib
import functools
p = pathlib.Path('/path/to.my/file.foo.bar.baz.quz')
print(functools.reduce(lambda v, _: v.with_suffix(''), p.suffixes, p).with_suffix('.jpg'))
print(functools.reduce(lambda v, e: v.with_suffix(e), ['' for _ in p.suffixes] + ['.jpg'], p))
Python 3.9+使用pathlib和str.removesuffix:
import pathlib
p = pathlib.Path('/path/to.my/file.foo.bar.baz.quz')
print(pathlib.Path(str(p).removesuffix(''.join(p.suffixes))).with_suffix('.jpg'))
不使用路径对象(仅限字符串)
一般来说,我认为使用pathlib的解决方案更简洁,但不是每个人都能做到这一点。如果你仍在使用python2,我很抱歉。如果你没有python2的pathlib包,我真的很抱歉。
更换所有扩展
使用os.path兼容Python 2.7:
import os
ps = '/path/to.my/file.foo.bar.baz.quz'
print(os.path.join(os.path.dirname(ps), os.path.basename(ps).split('.')[0] + '.jpg'))
Python 3.9+使用removesuffix和os。Path(如果你有python3.9,为什么不使用pathlib?)
import os
ps = '/path/to.my/file.foo.bar.baz.quz'
print(ps.removesuffix(os.path.splitext(ps)[-1].split('.', 1)[-1]) + 'jpg')