如何通过循环使用Tabula批量提取多PDF表格至DataFrame
自动化提取多PDF分散表格的解决方案
核心思路
把每个PDF的可变参数(年份、文件路径、每页表格的页码与区域)整理成结构化配置,通过双层循环批量处理:先遍历每个PDF,再遍历该PDF的所有目标页面,提取表格后逐步合并,最终得到完整数据集。
实现代码
import tabula import pandas as pd # 1. 定义所有PDF的配置信息 # 每个字典对应一份PDF,page_configs里的每个元组对应一页的(页码, 表格区域) pdf_configs = [ { "year": 2010, "file_path": r"C:\Users\User\Desktop\ReadPDF\2010.pdf", "page_configs": [ (1, (98.303, 71.0, 724.838, 552.185)), (2, (105.953, 71.0, 724.838, 552.185)), # 补充该PDF剩余18页的(页码, area)配置 ] }, { "year": 2011, "file_path": r"C:\Users\User\Desktop\ReadPDF\2011.pdf", "page_configs": [ # 填写2011年PDF每页的(页码, area)配置 ] }, # 补充剩余18份PDF的配置 ] # 2. 批量处理所有PDF all_pdf_dfs = [] for config in pdf_configs: page_dfs = [] for page_num, area in config["page_configs"]: # 提取当前页的表格(tabula返回列表,取第一个元素,若有多个表格可调整逻辑) extracted = tabula.read_pdf(config["file_path"], lattice=True, pages=page_num, area=area) if extracted: # 避免空列表导致报错 page_dfs.append(extracted[0]) # 合并当前PDF的所有页面表格 if page_dfs: pdf_total_df = pd.concat(page_dfs, axis=0, ignore_index=True) # 可选:添加年份列便于区分数据来源 pdf_total_df["year"] = config["year"] all_pdf_dfs.append(pdf_total_df) # 3. 合并所有PDF的最终数据集 if all_pdf_dfs: MDF = pd.concat(all_pdf_dfs, axis=0, ignore_index=True) # 可选:保存结果到Excel MDF.to_excel(r"C:\Users\User\Desktop\ReadPDF\all_years_data.xlsx", index=False)
关键说明
- 配置结构化:把所有可变参数集中在
pdf_configs里,后续修改页码、区域或新增PDF只需更新配置,无需改动核心逻辑。 - 空值处理:添加
if extracted:判断,避免某页未提取到表格时出现空DataFrame报错。 - 索引重置:
concat时加ignore_index=True,避免合并后索引重复混乱。 - 年份标记:可选添加
year列,方便后续数据筛选和溯源。
内容的提问来源于stack exchange,提问作者Bluefan22
相关产品推荐
相关产品推荐

