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))
关键修改说明
- 全局收集结果:用
all_matches列表存储每一页的匹配结果,通过extend方法追加,避免数据丢失。 - 调整写入时机:将文件写入操作移到循环外部,仅打开一次文件,一次性写入所有结果,彻底避免覆盖问题。
- 优化细节:
- 避免使用内置类型名
list作为变量名,改为all_matches。 - 简化正则表达式中的
\d{0,}为\d*,功能完全一致但更简洁。 - 移除了未使用的
csv导入。
- 避免使用内置类型名
内容的提问来源于stack exchange,提问作者Juan E Rojas Rodriguez
相关产品推荐
相关产品推荐

