Python中是否有一个内置函数可以替换(或删除)文件名的扩展名(如果有的话)?

例子:

print replace_extension('/home/user/somefile.txt', '.jpg')

在我的例子中,/home/user/somefile.txt将变成/home/user/somefile.jpg

我不知道这是否重要,但我需要这个我正在编写的SCons模块。(所以也许有一些特定的SCons函数我可以使用?)

我想要干净的。对字符串中出现的.txt进行简单的字符串替换显然是不干净的。(这将失败,如果我的文件名是somefile.txt.txt)


当前回答

另一种方法是使用str.rpartition(sep)方法。

例如:

filename = '/home/user/somefile.txt'
(prefix, sep, suffix) = filename.rpartition('.')

new_filename = prefix + '.jpg'

print new_filename

其他回答

我更喜欢下面使用str.rsplit()的一行程序方法:

my_filename.rsplit('.', 1)[0] + '.jpg'

例子:

>>> my_filename = '/home/user/somefile.txt'
>>> my_filename.rsplit('.', 1)
>>> ['/home/user/somefile', 'txt']

对于Python >= 3.4:

from pathlib import Path

filename = '/home/user/somefile.txt'

p = Path(filename)
new_filename = p.parent.joinpath(p.stem + '.jpg') # PosixPath('/home/user/somefile.jpg')
new_filename_str = str(new_filename) # '/home/user/somefile.jpg'

处理多个扩展

在使用pathlib和str.replace有多个扩展的情况下:

删除/条扩展

>>> from pathlib import Path
>>> p = Path("/path/to/myfile.tar.gz")
>>> extensions = "".join(p.suffixes)

# any python version
>>> str(p).replace(extensions, "")
'/path/to/myfile'

# python>=3.9
>>> str(p).removesuffix(extensions)
'/path/to/myfile'

替换扩展

>>> p = Path("/path/to/myfile.tar.gz")
>>> extensions = "".join(p.suffixes)
>>> new_ext = ".jpg"
>>> str(p).replace(extensions, new_ext)
'/path/to/myfile.jpg'

如果你还想要一个pathlib对象输出,那么显然你可以在Path()中换行

>>> Path(str(p).replace("".join(p.suffixes), ""))
PosixPath('/path/to/myfile')

把它们都包装在一个函数中

from pathlib import Path
from typing import Union

PathLike = Union[str, Path]


def replace_ext(path: PathLike, new_ext: str = "") -> Path:
    extensions = "".join(Path(path).suffixes)
    return Path(str(p).replace(extensions, new_ext))


p = Path("/path/to/myfile.tar.gz")
new_ext = ".jpg"

assert replace_ext(p, new_ext) == Path("/path/to/myfile.jpg")
assert replace_ext(str(p), new_ext) == Path("/path/to/myfile.jpg")
assert replace_ext(p) == Path("/path/to/myfile")
    

扩展AnaPana的答案,如何使用pathlib删除一个扩展(Python >= 3.4):

>>> from pathlib import Path

>>> filename = Path('/some/path/somefile.txt')

>>> filename_wo_ext = filename.with_suffix('')

>>> filename_replace_ext = filename.with_suffix('.jpg')

>>> print(filename)
/some/path/somefile.ext    

>>> print(filename_wo_ext)
/some/path/somefile

>>> print(filename_replace_ext)
/some/path/somefile.jpg

另一种方法是使用str.rpartition(sep)方法。

例如:

filename = '/home/user/somefile.txt'
(prefix, sep, suffix) = filename.rpartition('.')

new_filename = prefix + '.jpg'

print new_filename