使用Camelot提取PDF表格存为CSV时无文件输出问题求助
问题根因
你的代码一共存在4个核心错误,导致判断逻辑永远不触发、保存流程无法执行:
- 误用pandas的
head:df.head是方法对象,不是属性,必须加()调用才会返回数据;且默认df.head()返回前5行的DataFrame结构,根本不是单行表头,不可能和一维列表匹配。 - camelot读取表格时默认不会自动将第一行识别为列名,所有表格内容(包括你要匹配的表头)都按行存储在DataFrame的单元格中,第一行表头对应
df.iloc[0]。 shutil.move的参数必须是文件路径字符串/Path对象,你传入内存中的DataFrame对象会直接抛类型错误,就算前面生成了CSV也会执行失败。- 没有提前创建目标保存文件夹
Tables_csv,移动文件时会因为路径不存在报错。
修正方案
- 提取表头时取DataFrame第一行(索引为0的行),转成列表后再做匹配
- 保存CSV时直接指定目标文件夹的完整路径,不需要额外调用
shutil.move移动文件 - 提前判断保存文件夹是否存在,不存在则自动创建
- 匹配时先去除单元格前后空白字符,避免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
相关产品推荐
相关产品推荐

