多数人卡在camelot.read_pdf()报错或返回空列表,因pdf常为无边框的stream模式表格或扫描件(需ocr预处理),应改用flavor="stream"、指定pages、手动设table_regions。

为什么直接用 camelot.read_pdf() 常报错或返回空列表
多数人卡在这一步:PDF 本身不是表格数据,而是带坐标的图形对象。Camelot 默认用 Lattice 模式识别「有明确边框线」的表格,但现实中很多 PDF 表格只有文字对齐(即 Stream 模式适用场景)。若 PDF 是扫描件(图片型),camelot 完全无法处理——它不支持 OCR。
实操建议:
- 先用
pdfplumber打开 PDF 看一页文本是否可复制:如果复制出来是乱码或空,大概率是扫描件,得换 Tesseract + pdf2image 预处理 - 调用
camelot.read_pdf(..., flavor="stream")强制走无边框识别,尤其适合财报、政府文件里靠空格/缩进对齐的表格 - 加
pages="1-3"显式指定页码,避免默认只读第一页还报IndexError - 别信
table.area的自动检测,用table_regions手动框坐标(格式如["100,500,500,300"],单位是点,y 轴向下为正)
tabula-py 读取中文 PDF 表格时字段名乱码怎么办
tabula 底层调用 Java 的 tabula-java,对中文支持比 camelot 更稳,但默认编码是 Latin-1。只要 PDF 文字能被选中复制,乱码基本是编码参数没设对。
实操建议:
- 必须显式传
encoding="utf-8",否则tabula.read_pdf()返回的 DataFrame 列名和单元格全是 - 如果仍乱码,说明 PDF 内嵌字体未映射 UTF-8,此时加
lattice=True(强制边框识别)+guess=False(禁用区域猜测),减少解析干扰 - 导出 CSV 前务必检查
df.iloc[0]是否是真实表头;很多 PDF 表头跨行,tabula会把第一行当列名,需用df.columns = df.iloc[0]重设再df = df[1:]
提取后 CSV 中数字带逗号、货币符号或多余空格怎么清洗
PDF 表格原始排版导致的格式污染,不会因库切换消失。camelot 和 tabula 都返回原始字符串,不做类型推断。
inference.sh 的 Python SDK:运行 AI 应用、构建智能体,并集成 150 多个模型。包名:inferencesh (pip install inferencesh)。支持同步/异步……
实操建议:
- 别在 read 阶段硬塞
converters,PDF 表格列数不稳定,容易列错位;先统一用str类型读入,再按列处理 - 数值列清洗用
df["金额"].str.replace(r"[,$\s¥€]", "", regex=True).str.strip().replace("", np.nan),注意regex=True必须显式写,pandas 2.0+ 默认关了 - 日期列别依赖
pd.to_datetime()自动猜,PDF 里 “2023年12月” “12/31/2023” “31-DEC-2023” 混用很常见,先str.extract(r"(\d{4}).*(\d{1,2}).*(\d{1,2})")标准化再转
同一份 PDF 用 camelot 和 tabula 提取结果不一致,该信谁
这不是 bug,是底层逻辑差异:camelot 基于 OpenCV 找线+聚类文字块,tabula 基于 PDF 内容流顺序+字体大小突变判断表结构。两者互补,不是替代关系。
实操建议:
- 先跑
camelot.read_pdf(..., flavor="lattice"),看是否有完整边框表;没有就切到flavor="stream"并用row_tol=10调整行间距容忍度 - 再跑
tabula.read_pdf(..., pages=1, multiple_tables=True),对比返回的 tables 列表长度和首行内容 - 若 camelot 抓到 3 张表、tabula 抓到 5 张,大概率 camelot 合并了跨页表,而 tabula 把每页当独立单元——这时要人工核对 PDF 实际分页逻辑
- 最终合并用
pandas.concat(),但必须先统一列名:df.columns = df.columns.str.strip().str.replace(r"\s+", " ", regex=True)
最麻烦的永远不是库选哪个,而是 PDF 本身结构不规范:合并单元格没标记、表头旋转 90 度、页眉页脚混进表格区域。这时候得先用 pdfplumber 可视化定位,再手动切 region —— 自动化只是辅助,别指望一键全对。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










