按分组保留最新文件:本地路径文件删除异常及报错求助
批量保留每组最新文件的问题与解决方法
我有一批按组划分的文件,每组内文件日期不同但标签一致,需求是每组仅保留最新的文件。通过将标签作为字典的键,我在测试列表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']}
问题分析
路径操作不符合预期:
原判断条件os.path.join(path, file) != max(glob.glob(path + '*'))是拿当前文件和全局所有文件的最大值比较,而非本组内的最大值,导致除了全局文件名最大的文件外,其他所有文件都被删除。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
相关产品推荐
相关产品推荐

