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

使用Camelot提取PDF表格存为CSV时无文件输出问题求助

问题根因

你的代码一共存在4个核心错误,导致判断逻辑永远不触发、保存流程无法执行:

  • 误用pandas的head:df.head是方法对象,不是属性,必须加()调用才会返回数据;且默认df.head()返回前5行的DataFrame结构,根本不是单行表头,不可能和一维列表匹配。
  • camelot读取表格时默认不会自动将第一行识别为列名,所有表格内容(包括你要匹配的表头)都按行存储在DataFrame的单元格中,第一行表头对应df.iloc[0]。
  • shutil.move的参数必须是文件路径字符串/Path对象,你传入内存中的DataFrame对象会直接抛类型错误,就算前面生成了CSV也会执行失败。
  • 没有提前创建目标保存文件夹Tables_csv,移动文件时会因为路径不存在报错。
修正方案
  1. 提取表头时取DataFrame第一行(索引为0的行),转成列表后再做匹配
  2. 保存CSV时直接指定目标文件夹的完整路径,不需要额外调用shutil.move移动文件
  3. 提前判断保存文件夹是否存在,不存在则自动创建
  4. 匹配时先去除单元格前后空白字符,避免PDF提取带出的多余空格导致匹配失败
修正后可运行代码
from pathlib import Path
import camelot
import pandas as pd

# 初始化路径
p = Path.cwd() 
save_path = p.joinpath("Tables_csv")
# 提前创建保存目录,已存在则跳过不报错
save_path.mkdir(exist_ok=True)

# 读取第一页表格
tables = camelot.read_pdf("file.pdf", pages="1", line_scale=20)

for i, table in enumerate(tables):
    df = table.df
    # 提取第一行作为表头,清除每个单元格前后空白字符
    header = [cell.strip() for cell in df.iloc[0].tolist()]
    
    # 匹配对应表头执行保存
    if header == ["a", "b", "c"]:
        save_file = save_path.joinpath(f"abcTable{i}.csv")
        df.to_csv(save_file, index=False, encoding="utf-8-sig")
        print(f"已保存abc类表格到: {save_file}")
    elif header == ["d", "e", "f"]:
        save_file = save_path.joinpath(f"defTable{i}.csv")
        df.to_csv(save_file, index=False, encoding="utf-8-sig")
        print(f"已保存def类表格到: {save_file}")
    else:
        print(f"第{i}个表格表头为{header},不匹配规则已跳过")
额外说明
  • 保存CSV时加了encoding="utf-8-sig",避免导出的文件用Excel打开时出现中文乱码
  • 加了index=False参数,不会把pandas自动生成的行索引写入CSV文件
  • 增加了运行打印逻辑,可以直接在控制台看到每个表格的实际提取表头,方便后续排查匹配问题
  • 原代码中导入的os和shutil库属于错误使用,直接移除即可,不需要额外调用文件移动方法

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 15:15:47