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
相关产品推荐
相关产品推荐

