Python 清理文件名:rstrip 不是删除固定后缀
Python 清理文件名:rstrip 不是删除固定后缀
给一个文件名去掉 .py,很容易顺手写出 name.rstrip(".py")。但如果输入是 app.py,结果会变成 a,并不是预期的 app。这类问题在测试数据简单时很难出现,批量改名或生成输出路径时却可能破坏文件名。
参数代表字符集合,不是完整字符串
name = "app.py"
print(name.rstrip(".py")) # a
print(name.removesuffix(".py")) # app
rstrip(".py") 会从右向左连续删除属于 {'.', 'p', 'y'} 的字符,直到遇到不在集合里的字符。它先删除 y、p 和点,接着又删除文件名本身的两个 p,最后在 a 处停下。
类似地,lstrip(chars) 从左侧清理,strip(chars) 同时清理两端。它们都不把参数视为一个固定前缀或后缀,也不会按参数中的字符顺序匹配。无参数的 strip() 则主要用于去掉两端空白,内部空白会保留。
删除约定好的固定后缀
Python 3.9 起可以直接使用 removesuffix:
print("app.py".removesuffix(".py")) # app
print("app.txt".removesuffix(".py")) # app.txt
print("app.py.py".removesuffix(".py")) # app.py
print("app.PY".removesuffix(".py")) # app.PY
只有末尾完整匹配时才删除一次;没有匹配就返回原字符串。匹配区分大小写,不会自动把 .PY 当成 .py,也不会连续删除重复后缀。如果业务需要忽略大小写,应先明确规则,而不要悄悄把整个文件名转成小写。
处理旧版本 Python 时,可以写一个带判断的辅助函数:
def remove_suffix(text, suffix):
if suffix and text.endswith(suffix):
return text[:-len(suffix)]
return text
这里的 suffix 判断不能省掉。空字符串也满足 endswith(""),但 text[:-0] 等价于 text[:0],会把内容全部截空。删除固定前缀则可使用 removeprefix,不要用 lstrip 代替。
操作路径时,先明确“后缀”的含义
如果要把路径的最后一个扩展名换成另一个,更适合使用 pathlib:
from pathlib import Path
path = Path("reports/app.py")
print(path.with_suffix(".txt").as_posix()) # reports/app.txt
print(Path("archive.tar.gz").stem) # archive.tar
print(Path("archive.tar.gz").with_suffix("").as_posix())
# archive.tar
with_suffix 处理最后一个扩展名,不能把 .tar.gz 当然地看成一个整体。如果业务明确规定去掉完整的 .tar.gz,应对文件名使用 removesuffix(".tar.gz"),再保留原来的父目录。这里只是在计算新的路径,不会读取、重命名或删除磁盘上的文件。
用容易误删的输入做检查
除了正常的 main.py,至少检查 app.py、不匹配后缀、重复后缀、大小写差异和空后缀。它们能区分“清理字符集合”和“删除固定文本”这两种需求。
文本两端有一组杂字符需要清理时,strip 系列很合适;需要精确去掉某段约定文本时,选择 removeprefix 或 removesuffix;需要调整路径扩展名时,选择 pathlib。先把需求表达清楚,比在误删之后修补文件名更可靠。
- 点赞
- 收藏
- 关注作者
评论(0)