Python批量提取PDF文本写入CSV时添加表头问题求解
问题原因分析
- 第一版代码故障原因:表头写入逻辑放在了PDF遍历循环内部,每处理一个PDF文件就会写入一次表头,最终导致表头重复出现。
- 第二版代码故障原因:
- 写入表头时打开的文件对象未显式关闭,后续追加写入时存在资源冲突,引发格式错乱
- 写入表头的文件未指定
encoding="utf-8",和后续追加写入的编码规则不一致,容易出现字符解析异常 - PDF提取的文本中如果包含逗号、换行符等CSV默认控制字符,会触发CSV的自动拆分规则,导致单条文本分散到多个单元格
修正后可直接运行的代码
import pdfplumber import csv import glob # 匹配目标目录下所有PDF,路径用raw字符串避免转义问题 pdfs = glob.glob(r"dir/*.pdf") # 一次性打开CSV文件,避免重复IO操作 with open("pdf_output.csv", "w", newline="", encoding="utf-8") as f_output: # 配置csv写入器,强制所有字段加引号,避免特殊字符拆分单元格 csv_output = csv.writer(f_output, quoting=csv.QUOTE_ALL) # 只在最开始写一次表头 csv_output.writerow(['text']) for pf in pdfs: try: with pdfplumber.open(pf) as pdf: text = [] for page in pdf.pages: extracted_text = page.extract_text() if extracted_text: text.append(extracted_text) # 合并文本后写入单行 csv_output.writerow([' '.join(text)]) except Exception as e: print(f"处理文件{pf}失败,错误信息:{e}") continue
方案说明
- 把CSV文件的打开逻辑移到循环外部,只需要打开一次即可完成表头写入和所有PDF内容的写入,既避免了重复IO,也解决了资源冲突问题
- 给csv.writer增加
quoting=csv.QUOTE_ALL配置,所有写入的内容都会被双引号包裹,无论文本里有没有逗号、换行符,都会被识别为单个单元格的内容 - 增加了异常捕获逻辑,单个PDF文件损坏/读取失败不会中断整个提取任务
- 统一了文件编码为utf-8,避免不同编码写入导致的乱码问题
内容的提问来源于stack exchange,提问作者Daniel Hutchinson
相关产品推荐
相关产品推荐

