如何在tabula-py中设置页码范围?Ubuntu下Python3 PDF转CSV需求
处理大PDF转CSV的Python方案(Ubuntu+Python3)
嗨,针对你这个6041页的PDF转CSV需求,我推荐用pdfplumber库来实现——它比PyPDF2这类工具对表格的识别精度更高,尤其适合你这种每页固定结构的文档。下面是具体步骤:
1. 安装依赖
首先确保你的Ubuntu环境有Python3和pip,然后安装pdfplumber:
# 更新系统包并安装pip3 sudo apt update && sudo apt install python3-pip -y # 安装pdfplumber pip3 install pdfplumber
2. 编写处理脚本
创建一个Python脚本(比如pdf_to_csv.py),代码如下,我加了详细注释方便你理解:
import pdfplumber import csv # 配置文件路径 PDF_FILE = "Ativos_Fevereiro_2018_servidores.pdf" OUTPUT_CSV = "ativos_fevereiro_2018.csv" def main(): with open(OUTPUT_CSV, 'w', newline='', encoding='utf-8') as csv_out: writer = csv.writer(csv_out) header_written = False # 标记是否已写入表头(避免重复写入每页的表头) # 打开PDF文件 with pdfplumber.open(PDF_FILE) as pdf: total_pages = len(pdf.pages) print(f"开始处理,共 {total_pages} 页...") for page_idx, page in enumerate(pdf.pages, start=1): print(f"正在处理第 {page_idx}/{total_pages} 页") # 提取当前页的表格数据 # 用lines参数确保识别表格线,提升精度 table = page.extract_table(table_settings={ "vertical_strategy": "lines", "horizontal_strategy": "lines" }) if not table: print(f"警告:第 {page_idx} 页未识别到表格,跳过") continue # 处理表头:仅第一页写入表头 if not header_written: writer.writerow(table[0]) header_written = True # 第一页的数据行是table[1:](跳过表头) writer.writerows(table[1:]) else: # 后续页面跳过自带的表头,直接写入数据行 writer.writerows(table[1:]) print(f"处理完成!CSV文件已保存到 {OUTPUT_CSV}") if __name__ == "__main__": main()
3. 运行脚本
在终端执行:
python3 pdf_to_csv.py
注意事项
- 表格识别精度:如果某些页面的表格识别有问题,可以调整
table_settings的参数,比如把vertical_strategy改成text(适合无表格线的情况),具体可以参考pdfplumber的官方文档。 - 性能:6000多页的PDF处理大概需要5-10分钟(取决于你的机器性能),请耐心等待。
- 编码问题:脚本用了
utf-8编码保存CSV,能避免大部分乱码问题,如果仍有乱码,可以尝试换成latin-1编码(适合葡萄牙语等拉丁系语言文档)。 - 异常处理:如果个别页面出现错误,可以在代码中添加
try-except块跳过异常页,避免整个脚本中断。
内容的提问来源于stack exchange,提问作者Reinaldo Chaves
相关产品推荐
相关产品推荐

