求助:忽略日期前缀删除重复文件(Python实现)
解决删除重复文件的方案
你写的函数之所以没效果,核心问题是逻辑完全不对:你想通过list_files.count(file) > 1判断重复,但这些文件名因为前缀日期不同,每个都是唯一的,这个条件永远不会触发。就算逻辑能跑,也会错误删除所有包含该文件名的文件,完全不符合需求。
正确的思路是用正则提取每个文件名的核心部分,把相同核心的文件归为一组,每组只保留一个,删除其他。
具体实现代码
import os import re def delete_duplicate_files(target_dir): # 匹配文件名开头的日期时间前缀:YYYY-MM-DD HH-MM-SS - pattern = re.compile(r'^\d{4}-\d{2}-\d{2} \d{2}-\d{2}-\d{2} - ') # 用字典分组:key是核心文件名,value是该组的所有文件路径 file_groups = {} # 遍历目标目录下的所有文件 for filename in os.listdir(target_dir): file_path = os.path.join(target_dir, filename) # 只处理文件,跳过子目录 if not os.path.isfile(file_path): continue # 提取核心文件名(去掉日期前缀) match = pattern.match(filename) if match: core_name = filename[match.end():] # 将文件路径加入对应分组 if core_name not in file_groups: file_groups[core_name] = [] file_groups[core_name].append(file_path) # 处理每个分组:保留一个,删除其余 for core_name, files in file_groups.items(): if len(files) <= 1: continue # 无重复文件,直接跳过 # 按文件修改时间排序,保留最新的(要保留最早的就把reverse改成False) files_sorted = sorted(files, key=lambda x: os.path.getmtime(x), reverse=True) keep_file = files_sorted[0] delete_files = files_sorted[1:] print(f"核心文件名: {core_name}") print(f"保留文件: {os.path.basename(keep_file)}") for file in delete_files: try: os.remove(file) print(f"已删除: {os.path.basename(file)}") except Exception as e: print(f"删除失败 {os.path.basename(file)}: {str(e)}") # 使用示例:替换成你的目标目录路径 delete_duplicate_files("/path/to/your/target/folder")
代码说明
- 正则
^\d{4}-\d{2}-\d{2} \d{2}-\d{2}-\d{2} -精准匹配文件名开头的日期时间前缀,确保只处理符合格式的文件。 - 用字典按核心文件名分组,保证同一核心的文件都被归类到一起。
- 按文件修改时间排序,你可以根据需求选择保留最新或最早的文件;如果想按文件名日期排序,也可以把
sorted的key改成lambda x: os.path.basename(x)。 - 增加了异常捕获,打印删除失败的原因,方便排查问题。
注意事项
- 先备份目标目录的文件再测试,避免误删重要内容。
- 如果文件名的日期格式有变化,需要调整正则表达式来匹配。
- 确保脚本拥有目标目录的读写权限。
内容的提问来源于stack exchange,提问作者alex1779
相关产品推荐
相关产品推荐

