Python调用PyPDF2批量读取300份PDF触发TypeError报错排查
报错根因
你遇到的TypeError: not all arguments converted during string formatting由以下直接问题导致:
- 字符串格式化语法错误:你写的文件路径字符串
"/Users/n_n/Desktop/Digitalization/reserve"中没有设置任何格式化占位符(如匹配整数的%d、匹配字符串的%s),却通过% (k)传入了循环变量,Python找不到替换参数的位置,直接抛出类型错误。 - 路径逻辑缺失:原代码没有拼接PDF文件后缀,也没有做序号和文件名的连接,就算格式化语法改对,也会因为找不到对应文件触发后续报错。
- 额外兼容隐患:旧版本PyPDF2直接传入路径字符串调用
PdfFileReader存在概率性兼容问题,推荐先通过二进制模式打开文件句柄再传入解析器,同时新版PyPDF2已经用PdfReader替代了旧的PdfFileReader接口。
修复及完整预处理实现
以下代码直接修复读取报错,同时覆盖你提到的所有预处理规则、元数据关联逻辑:
import PyPDF2 import re import csv import string # 若需处理英文停用词可引入nltk,处理中文替换为对应中文分词、停用词逻辑即可 from nltk.corpus import stopwords # 预加载预处理资源 stop_words = set(stopwords.words('english')) punct_trans_table = str.maketrans('', '', string.punctuation) # 读取外部CSV元数据,建立序号到元数据的映射 # 注意根据你的CSV实际列名调整映射逻辑 metadata_dict = {} with open("/Users/n_n/Desktop/Digitalization/your_metadata_file.csv", "r", encoding="utf-8") as csv_f: csv_reader = csv.DictReader(csv_f) for row in csv_reader: # 假设CSV中file_id列对应PDF的1-311序号 file_idx = int(row["file_id"]) metadata_dict[file_idx] = row final_processed_data = [] for k in range(1, 312): # 修正路径拼接:按你的PDF实际命名规则调整,示例为reserve1.pdf、reserve2.pdf格式 # 如果是补零命名如reserve001.pdf,改为f"/Users/n_n/Desktop/Digitalization/reserve{k:03d}.pdf" pdf_path = f"/Users/n_n/Desktop/Digitalization/reserve{k}.pdf" # 二进制模式打开文件,避免PyPDF2兼容问题 with open(pdf_path, "rb") as pdf_f: reader = PyPDF2.PdfReader(pdf_f) # 提取全文档文本 raw_text = "" for page in reader.pages: page_content = page.extract_text() if page_content: raw_text += page_content # 执行预处理规则 # 1. 统一转小写 text_lower = raw_text.lower() # 2. 移除所有标点 text_no_punct = text_lower.translate(punct_trans_table) # 3. 删除停用词 word_list = text_no_punct.split() text_clean = " ".join([word for word in word_list if word not in stop_words]) # 4. 关联对应元数据 final_processed_data.append({ "file_id": k, "cleaned_content": text_clean, "metadata": metadata_dict.get(k, {}) })
适配调整提示
- 如果你的PDF命名规则和示例不一致,直接修改
pdf_path的拼接逻辑即可。 - 处理中文文本时,将英文停用词替换为中文停用词表,分词环节替换为jieba等中文分词工具即可。
- 若出现PyPDF2版本兼容问题,执行
pip install --upgrade pypdf2升级到最新稳定版即可。
内容的提问来源于stack exchange,提问作者H.Stevens
相关产品推荐
相关产品推荐

