如何按文件名特征批量删除目录中含17的重复文件保留含18的
批量删除对应前缀下含“17”的文件解决方案
嗨,我来帮你搞定这个批量处理文件的问题!你的需求很清晰:对前缀相同的文件,保留带“18”的版本,删掉对应的“17”版本。咱们先看看你原来代码里的几个小问题,再一步步实现正确的逻辑。
原代码的问题分析
- 语法错误:
compare = re.search.startswitch(...)这行写法不对,re.search没有startswitch方法,应该用re.compile创建正则表达式对象后,再用match方法做匹配 - 正则表达式过于复杂:其实不需要写冗长的规则,我们可以更简洁地提取前缀和年份标识(17/18)
- 逻辑不完整:没有实现「按前缀分组对比」的核心逻辑,只是单独匹配每个文件,没法判断某个17文件是否有对应的18版本
正确的实现思路
- 遍历并筛选文件:先获取目标文件夹里的所有
.jwl文件,过滤掉不符合格式的文件 - 按前缀分组:把文件名拆分为「前缀」和「年份部分」,比如
bh_txbh171002.jwl的前缀是bh_txbh,年份是17;将同一前缀的文件归为一组 - 分组处理文件:对每个前缀组,检查是否存在带“18”的文件,如果存在,就删掉组内所有带“17”的文件;如果只有“17”的文件,就保留(你可以根据需求调整这部分逻辑)
修复后的代码
import os import re def process_files(dir_name): # 定义正则:匹配前缀(数字前的部分)、年份(17/18)、后缀 pattern = re.compile(r'^(.+?)(17|18)\d{4}\.jwl$') file_groups = {} # 第一步:遍历文件夹,按前缀分组 for filename in os.listdir(dir_name): match = pattern.match(filename) if match: prefix = match.group(1) year = match.group(2) # 把文件按前缀存入字典,key是前缀,value是{年份: 文件名列表} if prefix not in file_groups: file_groups[prefix] = {'17': [], '18': []} file_groups[prefix][year].append(filename) # 第二步:遍历每个前缀组,处理文件 for prefix, groups in file_groups.items(): # 如果当前前缀同时有17和18的文件,删除所有17的文件 if groups['18'] and groups['17']: for file_to_delete in groups['17']: file_path = os.path.join(dir_name, file_to_delete) try: os.remove(file_path) print(f"已删除: {file_path}") except OSError as e: print(f"删除文件失败 {file_path}: {e}") # 如果只有17的文件,这里选择保留,你可以添加删除逻辑如果需要 elif groups['17']: print(f"前缀 {prefix} 只有17版本文件,保留: {groups['17']}") # 只有18的文件,直接保留 else: print(f"前缀 {prefix} 只有18版本文件,保留: {groups['18']}") if __name__ == "__main__": dir_name = "/Python/Schems" process_files(dir_name)
代码说明
- 正则表达式:
^(.+?)(17|18)\d{4}\.jwl$用非贪婪匹配(.+?)提取前缀,捕获年份17或18,接着匹配4位日期数字,最后匹配.jwl后缀,精准筛选目标文件 - 分组逻辑:用字典
file_groups把同一前缀的文件按17/18分类,方便后续对比判断 - 错误处理:添加
try-except捕获删除文件时的异常(比如文件被占用、权限不足等情况) - 灵活性:如果想要删除所有17版本文件(不管有没有对应的18版本),只需要去掉
if groups['18']的判断条件即可
内容的提问来源于stack exchange,提问作者Alexander Larionov
相关产品推荐
相关产品推荐

