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

Python脚本提取PDF正则匹配内容仅写入首个结果,求排查

问题分析与修复方案

你的脚本仅写入单个匹配结果,核心问题有两个:

问题点

  • 未持续收集匹配结果:每次循环会用当前页的匹配覆盖CINV变量,之前页面的匹配数据直接丢失,最终只保留最后一次赋值的内容。
  • 文件写入逻辑错误:with open(...)放在循环内部,且使用w+模式——该模式每次打开文件都会清空原有内容,导致每次循环都会覆盖之前的写入,最终文件仅保留最后一次循环的输出。

修复后的代码

import re
import PyPDF2

# PDF文件路径
CROZER = r"C:\Users\PC\Documents\Prospect Data\Crozer Invoices\rest of inovices\Crozer.pdf"

# 读取PDF文档
doc = PyPDF2.PdfFileReader(CROZER)
total_pages = doc.getNumPages()

# 定义匹配正则表达式
PO_PATTERN = re.compile(r'PO:\s\w{3}\d*|Invoice\s#:\s\d*')
all_matches = []  # 存储所有页面的匹配结果

for page_num in range(total_pages):
    current_page = doc.getPage(page_num)
    page_text = current_page.extractText()
    # 获取当前页所有匹配项
    page_matches = PO_PATTERN.findall(page_text)
    if page_matches:
        all_matches.extend(page_matches)
        print(f"第{page_num+1}页匹配结果:{page_matches}")

# 将所有匹配结果写入文件
with open('CI.txt', 'w', encoding='utf8') as output_file:
    # 每行写入一个匹配结果,可读性更强
    for match in all_matches:
        output_file.write(f"{match}\n")
    # 如果需要保留列表格式写入,替换上面的循环为:
    # output_file.write(str(all_matches))

关键修改说明

  1. 全局收集结果:用all_matches列表存储每一页的匹配结果,通过extend方法追加,避免数据丢失。
  2. 调整写入时机:将文件写入操作移到循环外部,仅打开一次文件,一次性写入所有结果,彻底避免覆盖问题。
  3. 优化细节:
    • 避免使用内置类型名list作为变量名,改为all_matches。
    • 简化正则表达式中的\d{0,}为\d*,功能完全一致但更简洁。
    • 移除了未使用的csv导入。

内容的提问来源于stack exchange,提问作者Juan E Rojas Rodriguez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 18:15:40