Python中如何保留指定结尾数字的文件并删除其余文件?
解决方案
问题背景
我有一批按以下格式生成的文件:
body00123.txt body00124.txt body00125.txt body-1-2126.txt body-1-2127.txt body-1-2128.txt body-3-3129.txt body-3-3130.txt body-3-3131.txt
文件名规则:前两组数字可为负数,但最后三位数字非负。
现在需要保留文件名结尾三位数字在以下列表中的文件,删除其余所有.txt文件:
123 127 129
期望保留的文件示例:
body00123.txt body-1-2127.txt body-3-3129.txt
之前尝试了这段Python代码,但结果是所有文件都被删除了:
if i not in myList: os.system('rm body*' + str(i) + '.txt')
问题原因
你之前的逻辑存在两个核心问题:
- 逻辑反转:错误地尝试删除"不在保留列表里的数字对应的文件",但通配符
body*会模糊匹配所有以body开头的文件,导致误删; - 匹配精度不足:没有精准定位到文件名的最后三位数字,容易出现误匹配。
正确实现方法
推荐用Python原生的glob和os模块精准处理,避免shell通配符的风险:
import os import glob # 要保留的结尾数字(转成字符串,方便直接匹配) keep_endings = {'123', '127', '129'} # 遍历所有body开头的txt文件 for file_path in glob.glob('body*.txt'): # 提取纯文件名(去掉路径) filename = os.path.basename(file_path) # 截取文件名中除.txt后缀外的部分 name_core = filename[:-4] # 提取最后三位数字 end_num = name_core[-3:] # 判断是否需要删除 if end_num not in keep_endings: os.remove(file_path) # 可选:打印删除日志 # print(f"已删除 {file_path}")
方案优势
- 精准匹配:不管文件名前缀格式如何,只取最后三位数字判断,完全符合需求;
- 安全可控:不用调用shell命令,避免通配符模糊匹配导致的误删;
- 逻辑清晰:逐个遍历文件,明确判断保留/删除规则,不易出错。
内容的提问来源于stack exchange,提问作者Rashid Abramov
相关产品推荐
相关产品推荐

