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

如何在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下的日志文件)
        # ...

关键优化点

  1. 高效判断已处理文件:
    • 将已处理文件的绝对路径存入集合,利用集合O(1)的成员查询效率,避免每次判断都触发磁盘IO,大幅提升遍历速度。
  2. 简化文件遍历逻辑:
    • 替换原itertools.chain多rglob的写法,改用单rglob加后缀过滤,代码更简洁易维护。
  3. 路径匹配准确性:
    • 使用relative_to获取输入文件相对根目录的路径,确保输出路径与输入路径结构完全对应;resolve()处理绝对路径和符号链接问题,避免路径匹配错误。
  4. 内存友好:
    • 仅存储已处理文件的路径字符串,2.5万条记录仅占用几MB内存,不会引发新的OOM问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 01:30:27