想去掉文件名末尾的 .txt,写成 name.rstrip('.txt'),看起来很顺手。但我用几个字符串一试,发现它连文件名本身的字母也会删掉。原因是:rstrip() 接收的不是“完整后缀”,而是一组允许从末尾移除的字符。
report.txt 为什么变成了 repor
name = 'report.txt'
print(name.rstrip('.txt')) # repor
print(name.removesuffix('.txt')) # report
在 Python 3.14.7 中执行,两个结果确实不同。rstrip('.txt') 会从右向左移除属于点号、t、x 这组字符的内容;删完扩展名后,report 末尾的 t 仍在这组字符里,于是也被删了。参数里 t 出现两次,并不改变这个规则。
Python 官方文档明确提醒:chars 参数不是后缀字符串。只想删掉一个精确后缀,应使用 removesuffix(),而不是把 rstrip() 当成“右侧字符串替换”。
再测三个边界,别用一个成功样本下结论
for name in ['text.txt', 'report.txt.bak', 'report.TXT']:
print(name, name.rstrip('.txt'), name.removesuffix('.txt'))
实际输出依次是:
- text.txt:rstrip() 得到 te,removesuffix() 得到 text。
- report.txt.bak:两种写法都保持原样,因为末尾是 bak。
- report.TXT:两种写法也都保持原样;这里没有进行忽略大小写的匹配。
我的选择是先说清意图:去掉一个明确的字面后缀,用 name.removesuffix('.txt');清理末尾任意组合的指定字符,才用 rstrip(chars)。removesuffix() 从 Python 3.9 开始提供,旧环境要先确认版本。
这还不是一套文件扩展名处理方案:多重扩展名、路径、点文件和大小写策略需要另行定义。本文只测试字符串,没有重命名或删除真实文件,也不把扩展名检查当成文件类型或安全校验。
结论:去后缀时,先区分“一个完整字符串”和“一组字符”。给回归样本加一个与扩展名共享末尾字母的名字,往往比多测几个普通文件名更能暴露问题。
本文是合成样本小实验与 AI 辅助整理;实验使用 Python 3.14.7,官方 Python 3.14 分支文档于 2026 年 10 月 14 日核对,没有验证生产收益。
一手资料
Python 官方字符串文档:rstrip()、removesuffix() 及适用版本