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

Python解析大JSON文件时的解码错误与程序挂起问题求助

解决JSON文件加载的UnicodeDecodeError及挂起问题

结合你遇到的编码错误、加载无响应问题,以及提供的字节片段细节,我们可以一步步解决这个问题:

问题根源拆解

  1. 初始的UnicodeDecodeError:Windows环境下Python默认用cp1252编码读取文件,但你的JSON里包含0x81字节——这个字节在cp1252编码中没有对应字符,直接触发了解码失败。
  2. utf-8加载挂起:文件里存在不符合utf-8规范的字节(比如0x81),再加上8000条记录的大体积,导致json.load在解析时卡住。
  3. 乱码细节:你提供的字节片段里\xc3\x83\xc2\x89是典型的双重编码问题——原本的é(utf-8为\xc3\xa9)被错误当成latin-1编码读取后,又被转成utf-8存储,最终变成了乱码。

解决方案:先兼容读取,再修正编码

我们可以先以兼容所有字节的编码读取文件,修正编码问题后再解析JSON,具体方案如下:

方案1:手动修正编码问题

import json

# 1. 用latin-1编码读取文件(latin-1会映射所有字节到字符,不会抛出解码错误)
with open('json_list.json', encoding='latin-1') as fd:
    raw_json_str = fd.read()

# 2. 修复双重编码乱码:把字符串转回原始字节,再用utf-8解码
fixed_json_str = raw_json_str.encode('latin-1').decode('utf-8')

# 3. 移除无效的0x81控制字符(如果这个字符是无用的干扰项)
fixed_json_str = fixed_json_str.replace('\x81', '')

# 4. 解析JSON数据
json_data = json.loads(fixed_json_str)

# 验证:打印前5条记录确认结果
print(json_data[:5])

方案2:自动检测文件编码(需第三方库)

如果不确定文件编码,可以用chardet库自动检测,先安装依赖:

pip install chardet

然后执行以下代码:

import json
import chardet

# 1. 二进制读取文件,自动检测编码
with open('json_list.json', 'rb') as fd:
    raw_bytes = fd.read()
    detect_result = chardet.detect(raw_bytes)
    file_encoding = detect_result['encoding']
    print(f"检测到文件编码:{file_encoding},置信度:{detect_result['confidence']}")

# 2. 用检测到的编码解码并解析,失败则 fallback 到方案1
try:
    json_data = json.loads(raw_bytes.decode(file_encoding))
    print(json_data[:5])
except UnicodeDecodeError:
    raw_json_str = raw_bytes.decode('latin-1')
    fixed_json_str = raw_json_str.encode('latin-1').decode('utf-8').replace('\x81', '')
    json_data = json.loads(fixed_json_str)
    print(json_data[:5])

方案有效性说明

  • latin-1编码的特性是每个字节对应唯一字符,能完整读取文件内容而不触发解码错误。
  • 双重编码的乱码通过encode('latin-1')转回原始字节,再用utf-8解码即可恢复正确字符。
  • 移除\x81字符可以避免它干扰JSON的正常解析流程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:21:41