Python解析大JSON文件时的解码错误与程序挂起问题求助
解决JSON文件加载的UnicodeDecodeError及挂起问题
结合你遇到的编码错误、加载无响应问题,以及提供的字节片段细节,我们可以一步步解决这个问题:
问题根源拆解
- 初始的UnicodeDecodeError:Windows环境下Python默认用
cp1252编码读取文件,但你的JSON里包含0x81字节——这个字节在cp1252编码中没有对应字符,直接触发了解码失败。 - utf-8加载挂起:文件里存在不符合utf-8规范的字节(比如
0x81),再加上8000条记录的大体积,导致json.load在解析时卡住。 - 乱码细节:你提供的字节片段里
\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
相关产品推荐
相关产品推荐

