无法读取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
相关产品推荐
相关产品推荐

