Python中是否有一个内置函数可以替换(或删除)文件名的扩展名(如果有的话)?
例子:
print replace_extension('/home/user/somefile.txt', '.jpg')
在我的例子中,/home/user/somefile.txt将变成/home/user/somefile.jpg
我不知道这是否重要,但我需要这个我正在编写的SCons模块。(所以也许有一些特定的SCons函数我可以使用?)
我想要干净的。对字符串中出现的.txt进行简单的字符串替换显然是不干净的。(这将失败,如果我的文件名是somefile.txt.txt)
处理多个扩展
在使用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")