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'))
替换所有扩展名
使用pathlib中的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
和 os.path
(如果你有 Python 3.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')
path.removesuffix('.txt') + '.jpg'
,这很可能是未来最简单的方法。请参考https://www.python.org/dev/peps/pep-0616/。 - panofsteelremovesuffix
是一个字符串方法:https://docs.python.org/3.9/library/stdtypes.html#str.removesuffix 编辑:所以要澄清的是,在 panofsteel 的例子中,path
只是一个字符串。 - vthomas2007