如何在pathlib glob中排除已处理文件,重启Python OCR批量任务?
扫描文档OCR处理脚本:排除已处理文件方案
问题背景
使用Python AI工具处理20万份扫描文档转文本时,因内存不足(OOM)导致脚本被系统终止。需要重启脚本时自动跳过已处理完成的文件,避免重复工作。已处理文件以无后缀形式保存在输出目录,路径与输入文件对应(仅替换根目录并移除后缀)。
解决方案实现
核心思路:预加载所有已处理文件的路径到内存集合,遍历输入文件时生成对应输出路径,通过集合快速判断是否已处理,仅处理未完成的文件。
修改后的完整代码
import sys from pathlib import Path companyfolder = sys.argv[1] companypath = Path(f"/home/user/download/{companyfolder}") outputpath = Path(f"/home/user/output/{companyfolder}/OCR") errorpath = Path(f"/home/user/output/{companyfolder}") # 预加载已处理文件的绝对路径集合(用于快速判断) processed_files = set() if outputpath.exists(): for processed_file in outputpath.rglob("*"): if processed_file.is_file(): processed_files.add(processed_file.resolve()) # 定义需要处理的文件后缀(包含大小写) target_suffixes = { ".jpeg", ".JPEG", ".jpg", ".JPG", ".png", ".PNG", ".tif", ".TIF", ".tiff", ".TIFF", ".bmp", ".BMP", ".pdf", ".PDF" } # 遍历待处理文件,跳过已完成的任务 for file in companypath.rglob("*"): # 跳过目录和非目标后缀的文件 if not file.is_file() or file.suffix not in target_suffixes: continue # 生成对应输出文件路径(移除输入文件的后缀) relative_path = file.relative_to(companypath) output_file = outputpath / relative_path.with_suffix('') # 检查是否已处理,是则跳过 if output_file.resolve() in processed_files: print(f"跳过已处理: {file}") continue # 执行OCR处理逻辑 try: print(f"处理中: {file}") # 你的OCR命令、结果保存等逻辑写在这里 # ... except Exception as e: print(f"处理失败: {file}, 错误: {str(e)}") # 错误日志记录逻辑(可写入errorpath下的日志文件) # ...
关键优化点
- 高效判断已处理文件:
- 将已处理文件的绝对路径存入集合,利用集合O(1)的成员查询效率,避免每次判断都触发磁盘IO,大幅提升遍历速度。
- 简化文件遍历逻辑:
- 替换原
itertools.chain多rglob的写法,改用单rglob加后缀过滤,代码更简洁易维护。
- 替换原
- 路径匹配准确性:
- 使用
relative_to获取输入文件相对根目录的路径,确保输出路径与输入路径结构完全对应;resolve()处理绝对路径和符号链接问题,避免路径匹配错误。
- 使用
- 内存友好:
- 仅存储已处理文件的路径字符串,2.5万条记录仅占用几MB内存,不会引发新的OOM问题。
内容的提问来源于stack exchange,提问作者unixcandles
相关产品推荐
相关产品推荐

