如何避免提取跨多页PDF表格时丢失第二页首行数据?
问题
我有一个总计33行(行数可能变动)的PDF表格,跨两页显示,被识别为两个独立表格。目标是提取第0、2、3列的所有数据并分别存入三个列表,功能已实现,但第二页首行数据丢失。
当前使用的Python脚本:
import tabula file_path = "address.pdf" tables = tabula.read_pdf(file_path, pages="all", multiple_tables=True) full_range_index = 0 full_range = [] starting_range_index = 2 starting_range = [] ending_range_index = 3 ending_range = [] table_one_row_count = 27 table_two_row_count = 6 # for i in range(table_one_row_count): # extracted_row = tables[0].iloc[i].values.tolist() # full_range.append(extracted_row[full_range_index]) # starting_range.append(extracted_row[starting_range_index]) # ending_range.append(extracted_row[ending_range_index]) for i in range(table_two_row_count): extracted_row = tables[1].iloc[i].values.tolist() full_range.append(extracted_row[full_range_index]) starting_range.append(extracted_row[starting_range_index]) ending_range.append(extracted_row[ending_range_index]) print(full_range)
预期full_range为['one', 'two', 'three', 'four', 'five', 'six'],实际结果为[nan, 'two', 'three', 'four', 'five', 'six']。
解决方案
1. 关闭表头猜测,避免首行被误识别
第二页首行出现nan的核心原因是Tabula默认会猜测表头,把第二页的首行当成重复表头处理,导致数据被标记为空。修改read_pdf参数,强制关闭表头猜测:
tables = tabula.read_pdf(file_path, pages="all", multiple_tables=True, guess=False, header=None)
2. 动态获取表格行数,摒弃硬编码
不要用固定数值指定行数,直接通过表格的shape[0]获取实际行数,适配行数变动的情况:
# 处理第一个表格 for i in range(tables[0].shape[0]): extracted_row = tables[0].iloc[i].values.tolist() full_range.append(extracted_row[full_range_index]) starting_range.append(extracted_row[starting_range_index]) ending_range.append(extracted_row[ending_range_index]) # 处理第二个表格 for i in range(tables[1].shape[0]): extracted_row = tables[1].iloc[i].values.tolist() full_range.append(extracted_row[full_range_index]) starting_range.append(extracted_row[starting_range_index]) ending_range.append(extracted_row[ending_range_index])
3. 清理结果中的NaN值
如果仍有nan混入,用列表推导式过滤或替换:
import pandas as pd # 过滤NaN值 full_range = [x for x in full_range if not pd.isna(x)] # 或替换为空字符串 full_range = [x if not pd.isna(x) else "" for x in full_range]
4. 合并表格后批量提取(更高效)
既然原本是一个跨页表格,直接合并两个识别出的DataFrame,再提取对应列,简化代码:
import pandas as pd import tabula file_path = "address.pdf" tables = tabula.read_pdf(file_path, pages="all", multiple_tables=True, guess=False, header=None) # 合并两个表格 combined_table = pd.concat(tables, ignore_index=True) # 提取指定列转为列表 full_range = combined_table.iloc[:, 0].tolist() starting_range = combined_table.iloc[:, 2].tolist() ending_range = combined_table.iloc[:, 3].tolist() # 清理NaN full_range = [x for x in full_range if not pd.isna(x)]
内容的提问来源于stack exchange,提问作者agw2021
相关产品推荐
相关产品推荐

