如何检测文件夹中连续命名文件的缺失情况
批量检测连续编号文件的缺失项
针对你处理百万级连续编号文件的需求,这里提供高效的解决方案,核心思路是提取所有文件的编号,对比连续区间找出缺失项:
高效实现方案(适用于500万级文件)
使用os.scandir替代glob,它能迭代读取目录条目,大幅降低内存占用,同时用正则精准匹配文件名格式:
import os import re def find_missing_files(folder_path, prefix="Name-", suffix=".txt"): existing_numbers = set() # 匹配固定前缀+10位数字+固定后缀的文件名 file_pattern = re.compile(rf"^{re.escape(prefix)}(\d{{10}}){re.escape(suffix)}$") # 迭代遍历目录,只处理符合格式的文件 with os.scandir(folder_path) as entries: for entry in entries: if entry.is_file(): match_result = file_pattern.match(entry.name) if match_result: file_number = int(match_result.group(1)) existing_numbers.add(file_number) if not existing_numbers: print("未找到符合格式的目标文件") return # 确定编号区间 min_number = min(existing_numbers) max_number = max(existing_numbers) # 生成区间内所有预期编号 expected_numbers = set(range(min_number, max_number + 1)) # 计算缺失编号并排序 missing_numbers = sorted(expected_numbers - existing_numbers) if missing_numbers: print(f"共发现 {len(missing_numbers)} 个缺失文件:") # 只显示前10个避免输出过载 for num in missing_numbers[:10]: print(f"{prefix}{num:010d}{suffix}") if len(missing_numbers) > 10: print(f"... 剩余 {len(missing_numbers)-10} 个缺失文件未显示") else: print("所有编号连续,无缺失文件") # 调用示例,替换为你的文件夹路径 find_missing_files("K:/path_to_files")
关键优化点
- 内存高效:
os.scandir无需一次性加载所有文件路径到内存,处理百万级文件更流畅 - 精准过滤:正则表达式确保只处理符合
Name-0000000000.txt格式的文件,排除杂文件干扰 - 快速对比:用集合存储已存在的编号,求差集的操作时间复杂度极低
基于你现有代码的修改版(依赖创建时间)
如果你坚持用文件创建时间确定首尾编号,可修改原有代码如下(注意:创建时间可能与编号不对应,存在误差风险):
import glob import os import re folder_path = 'K:/path_to_files' # 只匹配目标格式文件 list_of_files = glob.glob(f"{folder_path}/Name-*.txt") first_file = min(list_of_files, key=os.path.getctime) latest_file = max(list_of_files, key=os.path.getctime) # 提取首尾文件的编号 num_pattern = re.compile(r"Name-(\d{10})\.txt") min_num = int(num_pattern.search(first_file).group(1)) max_num = int(num_pattern.search(latest_file).group(1)) # 收集所有已存在的编号 existing_numbers = set() for file_path in list_of_files: match = num_pattern.search(file_path) if match: existing_numbers.add(int(match.group(1))) # 找出缺失编号 expected_numbers = set(range(min_num, max_num + 1)) missing_numbers = sorted(expected_numbers - existing_numbers) # 输出结果 if missing_numbers: print(f"缺失文件数量:{len(missing_numbers)}") print("部分缺失文件:") for num in missing_numbers[:10]: print(f"Name-{num:010d}.txt") else: print("无缺失文件")
内容的提问来源于stack exchange,提问作者Tiger1982
相关产品推荐
相关产品推荐

