You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按文件名特征批量删除目录中含17的重复文件保留含18的

批量删除对应前缀下含“17”的文件解决方案

嗨,我来帮你搞定这个批量处理文件的问题!你的需求很清晰:对前缀相同的文件,保留带“18”的版本,删掉对应的“17”版本。咱们先看看你原来代码里的几个小问题,再一步步实现正确的逻辑。

原代码的问题分析

  • 语法错误:compare = re.search.startswitch(...) 这行写法不对,re.search没有startswitch方法,应该用re.compile创建正则表达式对象后,再用match方法做匹配
  • 正则表达式过于复杂:其实不需要写冗长的规则,我们可以更简洁地提取前缀和年份标识(17/18)
  • 逻辑不完整:没有实现「按前缀分组对比」的核心逻辑,只是单独匹配每个文件,没法判断某个17文件是否有对应的18版本

正确的实现思路

  1. 遍历并筛选文件:先获取目标文件夹里的所有.jwl文件,过滤掉不符合格式的文件
  2. 按前缀分组:把文件名拆分为「前缀」和「年份部分」,比如bh_txbh171002.jwl的前缀是bh_txbh,年份是17;将同一前缀的文件归为一组
  3. 分组处理文件:对每个前缀组,检查是否存在带“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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:11:20