Python 清理文件名:rstrip 不是删除固定后缀

举报
TechCao 发表于 2026/11/08 06:08:01 2026/11/08
【摘要】 rstrip 的参数是字符集合,并非完整后缀。用 app.py 的误删示例区分 strip、removesuffix 和 pathlib,说明重复后缀、大小写、空后缀及多重扩展名的处理边界。

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。先把需求表达清楚,比在误删之后修补文件名更可靠。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。