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

无法读取JSON文件:解码'NaN'遇异常,两种方法均失效求助

解决读取JSON文件时ValueError: Unexpected character found when decoding 'NaN'的问题

尝试读取路径/content/drive/MyDrive/Hackathon project/PS 1,2/no_pii_action_history.json时触发以下报错:

ValueError                                Traceback (most recent call last)
<ipython-input-8-7c5fcf8552e0> in <cell line: 1>()
----> 1 df2 = pd.read_json('/content/drive/MyDrive/Hackathon project/PS 1,2/no_pii_action_history.json')

6 frames
/usr/local/lib/python3.10/dist-packages/pandas/io/json/_json.py in _parse_no_numpy(self)
   1319         if orient == "columns":
   1320             self.obj = DataFrame(
-> 1321                 loads(json, precise_float=self.precise_float), dtype=None
   1322             )
   1323         elif orient == "split":

ValueError: Unexpected character found when decoding 'NaN'

已尝试两种方法但未解决:

  • 直接调用pd.read_json读取文件
  • 用json模块自定义object_hook处理字符串形式的"nan"

问题根源

标准JSON规范中不存在NaN、Infinity这类数值常量,你的JSON文件大概率包含非标准的NaN(可能是大写、不带引号,或带有多余空格的形式),导致解析器无法识别。之前的object_hook仅处理字符串形式的小写"nan",但对常量形式的NaN无效。

可行解决方案

方案1:用正则替换非标准NaN为JSON标准的null

直接读取文件文本,将所有形式的NaN(含大小写、前后空格)替换为JSON支持的null,再解析:

import re
import pandas as pd

file_path = '/content/drive/MyDrive/Hackathon project/PS 1,2/no_pii_action_history.json'

with open(file_path, 'r') as f:
    json_content = f.read()
    # 匹配所有大小写的NaN,忽略前后空格
    cleaned_content = re.sub(r'\s*NaN\s*', 'null', json_content, flags=re.IGNORECASE)

df = pd.read_json(cleaned_content)

方案2:结合parse_constant处理常量形式的NaN

如果文件中的NaN是未加引号的数值常量,使用json.load的parse_constant参数处理,同时保留object_hook处理字符串形式的nan:

import json
import pandas as pd

def handle_str_nan(value):
    if isinstance(value, str) and value.lower() == 'nan':
        return float('nan')
    return value

file_path = '/content/drive/MyDrive/Hackathon project/PS 1,2/no_pii_action_history.json'

with open(file_path, 'r') as f:
    data = json.load(
        f,
        object_hook=handle_str_nan,
        parse_constant=lambda x: float('nan') if x.lower() == 'nan' else x
    )

df = pd.DataFrame(data)

方案3:指定pandas使用python引擎并允许NaN

部分情况下,切换pandas的JSON解析引擎为python,并显式允许NaN解析:

import pandas as pd

df = pd.read_json(
    '/content/drive/MyDrive/Hackathon project/PS 1,2/no_pii_action_history.json',
    engine='python',
    allow_nan=True
)

内容的提问来源于stack exchange,提问作者Kush Arora

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 19:20:20