谷歌云端硬盘12652份PDF关键词段落提取及Excel存储优化问询
大规模PDF文件关键词提取优化方案
问题背景
谷歌云端硬盘中存储了12652份PDF文件,需从中提取包含特定关键词的段落并保存至Excel表格,使用PyPDF2实现时运行速度较慢,原代码如下:
# import packages import PyPDF2 import re x=[] # open the pdf file def func(i): reader = PyPDF2.PdfReader(i) # get number of pages num_pages = len(reader.pages) # define key terms string = "material weakness" # extract text and do the search for page in reader.pages: text = page.extract_text() # print(text) res_search = re.search(string, text) if res_search: print(res_search) x.append(i) i=0 for f in files: try: # print(f) # print(i) # i+=1 func(f) if i==12651: break except: pass
优化方向及解决方案
1. 替换高效PDF解析库
PyPDF2的文本提取效率偏低,改用**PyMuPDF(fitz)**能大幅提升速度,它对复杂PDF的兼容性也更好:
import fitz def extract_text_fast(pdf_path): doc = fitz.open(pdf_path) full_text = "" for page in doc: full_text += page.get_text() return full_text
2. 并行处理文件
单线程遍历1万+文件效率极低,用concurrent.futures实现多线程/多进程处理,充分利用CPU资源:
from concurrent.futures import ThreadPoolExecutor import re def process_file(file_path): try: text = extract_text_fast(file_path) # 按空行分割段落,筛选含关键词的段落 paragraphs = text.split("\n\n") target_paras = [p.strip() for p in paragraphs if "material weakness" in p.lower()] if target_paras: return (file_path, "\n---\n".join(target_paras)) except Exception as e: print(f"处理{file_path}失败: {str(e)}") return None # 用8个线程批量处理,可根据CPU核心数调整 with ThreadPoolExecutor(max_workers=8) as executor: results = list(executor.map(process_file, files))
3. 云端文件读取优化
直接读取云端文件会有网络延迟,建议先批量下载文件到本地目录,或使用谷歌云端硬盘API的流式读取接口,减少IO等待时间。
4. 高效写入Excel
用pandas替代手动拼接数据,快速将结果写入Excel:
import pandas as pd # 过滤无效结果 valid_data = [item for item in results if item is not None] df = pd.DataFrame(valid_data, columns=["文件路径", "目标段落"]) df.to_excel("关键词提取结果.xlsx", index=False)
5. 其他细节优化
- 替换笼统的
except: pass,针对性捕获PDF读取、文本提取等异常,避免忽略关键错误 - 添加进度条(如
tqdm)跟踪处理进度:from tqdm import tqdm; results = list(tqdm(executor.map(...), total=len(files))) - 关键词匹配可改用
re.IGNORECASE忽略大小写,提升匹配范围
内容的提问来源于stack exchange,提问作者Aravind Ashokkumar
相关产品推荐
相关产品推荐

