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

加载含中文JSON文件遇UnicodeDecodeError,如何用try-except保留内容?

解决UnicodeDecodeError并保留有效JSON内容

当然可以用try-except语句处理这种情况!这样你既不会因为某一行的编码或格式问题导致整个加载流程中断,还能保留所有能正常解析的内容,非常实用。

问题分析

你的原代码是逐行读取并解析JSON,但一旦某一行出现非UTF-8编码的字符,就会直接抛出UnicodeDecodeError并终止整个过程。我们需要把异常捕获逻辑细化到每一行的处理环节,让错误只影响出问题的那一行,不波及其他行。

修改后的代码

import json

def load_from_json(fin):
    datas = []
    line_number = 0
    for line in fin:
        line_number += 1
        try:
            # 先处理空行,避免无意义的解析
            stripped_line = line.strip()
            if not stripped_line:
                continue
            # 尝试解析当前行的JSON
            data = json.loads(stripped_line)
            datas.append(data)
        except UnicodeDecodeError as e:
            print(f"⚠️ 第{line_number}行解码失败: {str(e)},已跳过该行")
        except json.JSONDecodeError as e:
            print(f"⚠️ 第{line_number}行JSON格式错误: {str(e)},已跳过该行")
    return datas

代码说明

  • 增加了行号追踪:方便你快速定位出问题的行,后续可以针对性修复文件内容
  • 双重异常捕获:分别处理编码错误(UnicodeDecodeError)和JSON格式错误(JSONDecodeError),覆盖了两种最常见的加载失败场景
  • 跳过空行:避免对空白行做无效解析,提升效率
  • 错误提示清晰:控制台会打印具体错误信息和行号,便于排查问题

额外优化建议

  1. 优先确认文件编码:如果大量行都出现解码错误,大概率是文件本身不是UTF-8编码(比如GBK、GB2312)。这时候可以直接指定正确编码打开文件,从根源解决问题:

    with open("your_file.json", "r", encoding="gbk") as fin:
        result = load_from_json(fin)
    
  2. 错误日志记录:如果需要长期留存错误信息,可以把打印换成写入日志文件,比如:

    import logging
    logging.basicConfig(filename='json_load_errors.log', level=logging.WARNING)
    # 捕获异常时替换print为:
    logging.warning(f"第{line_number}行解码失败: {str(e)}")
    

这样处理后,你的程序就能稳健地加载JSON文件,既不会丢失有效内容,也能清晰知晓哪些行出了问题~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 11:52:54