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

按分组保留最新文件:本地路径文件删除异常及报错求助

批量保留每组最新文件的问题与解决方法

我有一批按组划分的文件,每组内文件日期不同但标签一致,需求是每组仅保留最新的文件。通过将标签作为字典的键,我在测试列表test中实现了预期效果,但对本地路径执行删除操作时,最终只保留了某一组的最新文件,而非每组各保留一个。

测试代码与分组结果

测试列表代码:

test = ['Group_2020-01-03_ABC_Blue_2018-12-18.csv',
'Group_2020-01-13_ABC_Blue_2018-12-18.csv',
'Group_2020-01-24_ABC_Blue_2018-12-18.csv',
'Group_2020-01-03_DEF_Red_2019-01-30.csv',
'Group_2020-01-13_DEF_Red_2019-01-30.csv',
'Group_2020-01-24_DEF_Red_2019-01-30.csv',
'Group_2020-01-03_GHI_Green_2019-03-28.csv',
'Group_2020-01-13_GHI_Green_2019-03-28.csv',
'Group_2020-01-24_GHI_Green_2019-03-28.csv']

dictionary = {}
for file in glob.glob(path + '*'): # 替换为test可测试列表逻辑
    key = os.path.basename(file).split('_',2)[-1].split('.')[0]
    group = dictionary.get(key,[])
    group.append(os.path.basename(file))  
    dictionary[key] = group

生成的分组字典:

{'ABC_Blue_2018-12-18': ['Group_2020-01-03_ABC_Blue_2018-12-18.csv', 
    'Group_2020-01-13_ABC_Blue_2018-12-18.csv',
    'Group_2020-01-24_ABC_Blue_2018-12-18.csv'],
 'DEF_Red_2019-01-30': ['Group_2020-01-03_DEF_Red_2019-01-30.csv',
    'Group_2020-01-13_DEF_Red_2019-01-30.csv',
    'Group_2020-01-24_DEF_Red_2019-01-30.csv'],
 'GHI_Green_2019-03-28': ['Group_2020-01-03_GHI_Green_2019-03-28.csv',
    'Group_2020-01-13_GHI_Green_2019-03-28.csv',
    'Group_2020-01-24_GHI_Green_2019-03-28.csv']}

问题分析

  1. 路径操作不符合预期:
    原判断条件os.path.join(path, file) != max(glob.glob(path + '*'))是拿当前文件和全局所有文件的最大值比较,而非本组内的最大值,导致除了全局文件名最大的文件外,其他所有文件都被删除。

  2. FileNotFoundError报错:
    在遍历glob.glob(path + '*')的同时删除文件,会导致后续遍历到已被删除的文件;且字典未构建完成就开始判断删除,可能重复尝试删除同一个文件,最终触发文件不存在的报错。

解决方案

以下是修正后的完整代码,实现每组保留一个最新文件,同时避免删除报错:

import os
import glob

path = "你的本地文件路径"

# 1. 完整构建分组字典,存储文件完整路径
file_dict = {}
for full_path in glob.glob(os.path.join(path, "*")):
    filename = os.path.basename(full_path)
    # 提取标签作为分组键
    key = filename.split('_', 2)[-1].rsplit('.', 1)[0]
    if key not in file_dict:
        file_dict[key] = []
    file_dict[key].append(full_path)

# 2. 遍历每个分组,保留最新文件,删除其余
for group_key, file_list in file_dict.items():
    # 按文件名中的日期字段排序,取最后一个作为最新文件
    file_list.sort(key=lambda x: os.path.basename(x).split('_')[1])
    latest_file = file_list[-1]
    
    print(f"保留组 {group_key} 的最新文件:{os.path.basename(latest_file)}")
    # 删除非最新文件,先判断文件是否存在避免报错
    for file_path in file_list:
        if file_path != latest_file and os.path.exists(file_path):
            os.remove(file_path)
            print(f"已删除:{os.path.basename(file_path)}")

关键改进点

  • 存储文件完整路径,避免路径拼接出错
  • 对每个分组单独排序找最新文件,而非全局比较
  • 删除前先判断文件是否存在,防止重复删除导致的报错
  • 先构建完所有分组再执行删除,避免遍历过程中文件系统变化影响结果

内容的提问来源于stack exchange,提问作者Gerlex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 21:45:05