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

6000+页PDF文本快速提取及地址检索优化求助

一、PDF大文件文本提取提速方案

针对6000页的PDF,pdfplumber的文本提取效率确实偏慢,推荐以下几种提速方式:

1. 切换到PyMuPDF(fitz)库

PyMuPDF是目前性能最优的PDF文本提取库之一,处理大文件的速度远超pdfplumber。示例代码:

import fitz  # PyMuPDF

all_text = []
with fitz.open(pdf_dir) as doc:
    for page in doc:
        text = page.get_text()
        all_text.append(text)
all_text = ''.join(all_text)

用列表存储每页文本再join,比循环中+=字符串拼接效率更高(字符串是不可变类型,每次拼接都会生成新对象)。

2. 多进程并行提取

利用CPU多核并行处理每页提取,进一步缩短耗时。结合PyMuPDF的示例:

import fitz
from multiprocessing import Pool

def extract_page_text(page_num):
    with fitz.open(pdf_dir) as doc:
        return doc[page_num].get_text()

if __name__ == '__main__':
    with fitz.open(pdf_dir) as doc:
        page_nums = range(len(doc))
    
    with Pool() as pool:
        page_texts = pool.map(extract_page_text, page_nums)
    
    all_text = ''.join(page_texts)

注意:多进程会增加内存占用,若PDF内存占用过高,可调整进程数(比如Pool(processes=4)指定核心数)。

3. 禁用pdfplumber的非必要功能(如果坚持用pdfplumber)

如果必须保留pdfplumber,可通过关闭视觉分析等非必要功能提速:

all_text = []
with pdfplumber.open(pdf_dir) as pdf:
    for page in pdf.pages:
        text = page.extract_text(layout=False)  # 关闭布局分析,提速但可能损失格式
        all_text.append(text)
all_text = ''.join(all_text)
二、地址检索正则与代码优化建议

当前的地址检索代码可以从效率和准确性两方面优化:

1. 正则表达式优化

你的正则r'(: \d{5})'仅匹配": "加5位数字的片段,若要精准匹配地址行,建议补充上下文约束,比如匹配包含地址相关关键词开头或包含邮编的完整行:

# 示例:匹配包含"地址:"后接5位邮编的行,可根据实际地址格式调整
address_pattern = re.compile(r'.*地址:\s*\d{5}.*')

如果只是要提取邮编及前后关联内容,也可以直接提取目标片段而非整行:

address_pattern = re.compile(r'(地址:\s*\d{5})')

2. 代码效率优化

  • 避免拆分整个文本为行再循环,直接用正则对整个文本进行批量匹配,减少循环开销:
import re

address_pattern = re.compile(r'.*(:  \d{5}).*', re.MULTILINE)
# 一次性提取所有符合条件的行
matches = address_pattern.findall(all_text)
for match in matches:
    print(match)
  • 不要逐行print,若数据量较大,建议将结果写入文件而非实时打印,减少IO耗时:
with open('address_results.txt', 'w', encoding='utf-8') as f:
    f.write('\n'.join(matches))

3. 其他细节

  • 预编译正则的做法是对的,保持这个习惯,避免重复编译开销。
  • 如果文本中有大量空白行,可先过滤掉空行再匹配,减少无效遍历:
valid_lines = [line.strip() for line in all_text.split('\n') if line.strip()]
for line in valid_lines:
    if address_pattern.search(line):
        print(line)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 11:10:14