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

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

方案说明

  1. 把CSV文件的打开逻辑移到循环外部,只需要打开一次即可完成表头写入和所有PDF内容的写入,既避免了重复IO,也解决了资源冲突问题
  2. 给csv.writer增加quoting=csv.QUOTE_ALL配置,所有写入的内容都会被双引号包裹,无论文本里有没有逗号、换行符,都会被识别为单个单元格的内容
  3. 增加了异常捕获逻辑,单个PDF文件损坏/读取失败不会中断整个提取任务
  4. 统一了文件编码为utf-8,避免不同编码写入导致的乱码问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 20:24:04