You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:33:30