如何为Tabula转换PDF生成的CSV指定utf-8或cp1252编码?
解决Tabula批量转换PDF到CSV的编码问题
原代码直接用tabula.convert_into生成CSV,但这个方法没有提供指定编码的参数,导致出现编码相关错误。要生成utf-8或cp1252编码的CSV,得换个思路:先读取PDF里的表格数据,再手动指定编码写入文件。下面提供两种可行方案:
方案一:用Pandas指定编码(推荐)
借助Pandas的to_csv方法可以直接指定编码,同时还能方便处理多表格合并:
import os import glob import tabula import pandas as pd path = "/Users/username/Downloads/" for filepath in glob.glob(path + '*.pdf'): # 处理文件名,避免生成类似xxx.pdf.csv的冗余文件名 name = os.path.basename(filepath).replace('.pdf', '') # 读取PDF所有页面的表格,支持多表格 table_list = tabula.read_pdf(filepath, pages="all", multiple_tables=True) if table_list: # 合并所有表格(如果不需要合并,可单独处理每个表格) combined_table = pd.concat(table_list, ignore_index=True) # 写入CSV,指定utf-8编码;要cp1252的话把encoding改成'cp1252' combined_table.to_csv(f"{path}{name}.csv", encoding='utf-8', index=False)
方案二:用原生CSV模块指定编码
如果不想依赖Pandas,用Python内置的csv模块也能实现:
import os import glob import tabula import csv path = "/Users/username/Downloads/" for filepath in glob.glob(path + '*.pdf'): name = os.path.basename(filepath).replace('.pdf', '') table_list = tabula.read_pdf(filepath, pages="all", multiple_tables=True) if table_list: # 打开文件时指定编码,newline=''避免空行问题 with open(f"{path}{name}.csv", 'w', encoding='utf-8', newline='') as csv_file: writer = csv.writer(csv_file) # 写入第一份表格的表头 writer.writerow(table_list[0].columns.tolist()) # 遍历所有表格,写入数据行 for table in table_list: writer.writerows(table.values.tolist()) # 如需cp1252编码,修改encoding参数即可
两个方案都能解决编码错误问题,按需选择即可。
内容的提问来源于stack exchange,提问作者Kenny
相关产品推荐
相关产品推荐

