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
. 我还担心这里的某些答案无法处理.
父目录中的 a 。以下是完成扩展替换的几种方法。
使用路径对象
最多更换一个分机
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 的解决方案更干净,但不是每个人都能做到。如果您仍在使用 python 2,我很抱歉。如果你没有python2的pathlib包,真的很抱歉。
替换所有扩展
Python 2.7 兼容使用os.path
:
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
and 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')