使用tabula-py读取PDF表格:如何以字符串格式保留数值小数精度
解决tabula-py读取PDF表格时丢失小数精度的问题
我之前也碰到过一模一样的情况——用tabula读取带多位小数的数值时,自动转成float后末尾的零就没了,完全不符合需求。这里有两个可靠的方法帮你把数值以字符串格式读取,完整保留原始的小数精度:
方法一:通过CSV中转强制读取为字符串
这个方法的思路是让tabula先把表格输出为CSV格式(完整保留原始文本格式),再用pandas读取CSV时指定所有列的类型为字符串,避免自动类型推断改变原始内容:
from tabula import read_pdf import pandas as pd fn = "file.pdf" # 读取第一个表格的CSV格式内容 csv_content = read_pdf(fn, pages='all', multiple_tables=True, output_format='csv')[0] # 用pandas读取CSV字符串,强制所有列为字符串类型 df = pd.read_csv(pd.compat.StringIO(csv_content), dtype=str) print(df)
方法二:直接在read_pdf中指定pandas参数
tabula-py支持通过pandas_options参数传递设置给pandas,我们可以直接指定dtype=str,让所有列以字符串格式加载:
from tabula import read_pdf fn = "file.pdf" # 读取时通过pandas_options强制所有列为字符串 df = read_pdf(fn, pages='all', multiple_tables=True, pandas_options={'dtype': str})[0] print(df)
为什么会出现这个问题?
tabula-py默认会让pandas自动推断每列的数据类型,当遇到像20.0000这样的数值时,pandas会把它解析为float类型,而float类型会自动省略末尾无意义的零,看起来像是丢失了精度,但实际数值是准确的。如果你需要严格保留PDF里显示的文本格式,就必须强制以字符串类型读取。
如果之后需要把字符串转回数值类型进行计算,可以用pd.to_numeric()方法,比如:
df['your_column'] = pd.to_numeric(df['your_column'])
内容的提问来源于stack exchange,提问作者Klemz
相关产品推荐
相关产品推荐

