
当使用json.load()读取JSON文件时遇到UnicodeDecodeError: 'utf-8' codec can't decode byte...,本质是文件实际编码与Python默认UTF-8解码不匹配,需显式指定正确编码(如GBK、ISO-8859-1等),推荐用chardet自动检测。
当使用json.load()读取json文件时遇到unicodedecodeerror: 'utf-8' codec can't decode byte...,本质是文件实际编码与python默认utf-8解码不匹配,需显式指定正确编码(如gbk、iso-8859-1等),推荐用chardet自动检测。
在Python中加载JSON文件看似简单,但一旦文件并非标准UTF-8编码(例如由某些设备导出、Windows记事本保存或旧系统生成的JSON),就会触发UnicodeDecodeError——正如你遇到的错误:'utf-8' codec can't decode byte 0xcc in position 24: invalid continuation byte。该报错明确指出:Python尝试以UTF-8解码字节0xcc失败,说明文件实际使用了其他编码(如GBK、UTF-16、ISO-8859-1等)。
✅ 正确做法不是盲目修改打开模式或跳过错误,而是先探测真实编码,再以对应编码安全读取。推荐使用轻量可靠的第三方库 chardet(安装命令:pip install chardet):
import json
import chardet
# 步骤1:以二进制模式读取原始字节流
with open("test11.json", "rb") as f:
raw_bytes = f.read()
# 步骤2:自动检测编码(注意:chardet返回的是推测结果,置信度通常较高)
detected = chardet.detect(raw_bytes)
encoding = detected["encoding"] or "utf-8" # fallback to utf-8 if uncertain
print(f"Detected encoding: {encoding} (confidence: {detected['confidence']:.3f})")
# 步骤3:以检测到的编码重新打开并解析JSON
with open("test11.json", "r", encoding=encoding) as f:
data = json.load(f)
print("✅ JSON loaded successfully:", type(data), list(data.keys())[:5])
? 重要注意事项:
-
chardet.detect()基于统计分析,对短文本或无BOM的UTF-8/UTF-16文件可能误判。若检测结果置信度低于0.7,建议手动验证(例如用VS Code或Notepad++查看文件编码,或尝试常见编码如"gbk"、"latin-1"); - 若确定文件含中文且来自Windows环境,可优先试
encoding="gbk"或"gb18030"; - 使用
encoding="latin-1"可强制读取任意字节(不会报错),但可能导致中文乱码,仅作临时调试用; -
永远避免使用
errors="ignore"或errors="replace"直接忽略解码错误——这会破坏数据完整性,尤其影响后续数据库写入。
? 进阶提示:为提升健壮性,可封装成可重试函数:
def load_json_safely(filepath):
import chardet
import json
with open(filepath, "rb") as f:
raw = f.read()
enc = chardet.detect(raw)["encoding"] or "utf-8"
try:
with open(filepath, "r", encoding=enc) as f:
return json.load(f)
except UnicodeDecodeError:
# 备选:尝试常见编码
for alt_enc in ["gbk", "gb18030", "latin-1"]:
try:
with open(filepath, "r", encoding=alt_enc) as f:
return json.load(f)
except UnicodeDecodeError:
continue
raise ValueError(f"Unable to decode {filepath} with any known encoding.")
# 使用
data = load_json_safely("test11.json")
至此,你已获得结构完整的Python字典,可直接用于创建数据库表字段、批量插入记录等后续操作——无需额外转换,真正实现“所见即所得”的JSON数据落地。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











