使用pd.read_json读取含大数值JSON时如何指定dtype?
你遇到的这个问题,核心根源在于pandas read_json的解析流程顺序:它会先把整个JSON内容转换成Python原生对象(依赖Python标准库的json.loads),这一步在遇到超大整数时就会触发报错,而你指定的dtype参数是在pandas完成JSON解析、准备构建DataFrame时才生效的——换句话说,报错发生在dtype参数发挥作用之前,所以不管怎么指定都没用。
看你报错栈里的关键代码行就能明白:
loads(json, precise_float=self.precise_float), dtype=None)
这里的loads就是Python的json.loads,当解析的整数超出pandas默认解析逻辑的处理范围时,直接抛出ValueError: Value is too big,根本到不了指定dtype的阶段。
可行的解决方法
方法1:手动解析JSON,控制大整数的解析逻辑
绕开pandas的自动解析,先用Python原生json模块读取文件,通过parse_int参数指定大整数的解析方式(比如转成字符串或Python原生大整数),再转成DataFrame:
import json import pandas as pd # 把大整数解析为字符串(避免精度丢失) with open('sample.json', 'r') as f: data = json.load(f, parse_int=str) df = pd.DataFrame(data)
如果需要保留整数类型,也可以把parse_int设为lambda x: int(x)(Python原生int支持任意大小的整数),这样构建的DataFrame中col1会是object类型(存储Python大整数),不会丢失精度。
方法2:利用pandas.read_json的lines参数(适用单行JSON数组场景)
如果你的JSON是每行一个对象的格式(比如{"col1": 900000000000000000000}单独一行),可以用lines=True配合dtype:
df = pd.read_json('sample.json', lines=True, dtype={'col1': str})
不过这个方法仅适用于特定的JSON格式,通用性不如方法1。
补充说明
你提到把JSON中的大整数改成字符串形式后能正常读取,但返回float64类型——这是因为pandas会自动将形似数字的字符串转换为浮点数,但这种方式会丢失超大整数的精度,所以并不推荐。手动解析成字符串或Python原生大整数才是更安全的选择。
内容的提问来源于stack exchange,提问作者chris.mclennon

