使用tabula循环转换PDF为CSV时出现IndexError: list index out of range报错
报错根因
tabula.read_pdf()执行后返回的是当前单份PDF文件中提取到的所有表格组成的列表,该列表的长度仅和当前PDF里的表格数量有关,和全局循环的文件序号没有关联。你用全局循环变量推导出来的file-1去索引这个单文件表格列表,当当前PDF的表格数量小于file值时,就会触发索引越界。你前2个PDF文件的表格数刚好匹配你当时的file-1值,到第三个文件不匹配就直接报错。- 遍历文件的逻辑冗余错误:
range(len(filtered_files))生成的索引本身就是从0开始到列表长度减1,完全不需要额外减1,file-1会导致第一次循环直接取到列表最后一个文件,逻辑完全混乱。
修复后代码
import tabula import os import pandas as pd # 过滤当前目录下所有PDF文件 filtered_files = [file for file in os.listdir() if file.endswith(".pdf")] # 直接遍历每个PDF文件,不需要绕索引计算 for pdf_file in filtered_files: print(f"正在处理:{pdf_file}") # 提取当前PDF的所有表格 df_list = tabula.read_pdf(pdf_file) # 跳过没有提取到表格的PDF,避免报错 if not df_list: print(f"{pdf_file} 未识别到表格,跳过") continue # 适配多表格场景,每个表格单独存为CSV,不需要多表格的话可以直接取df_list[0]存储 for idx, df in enumerate(df_list): csv_name = f"{pdf_file.rsplit('.',1)[0]}_表{idx+1}.csv" df.to_csv(csv_name, encoding='utf-8') print(f"{pdf_file} 处理完成")
内容的提问来源于stack exchange,提问作者user3011030
相关产品推荐
相关产品推荐

