加载含中文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),覆盖了两种最常见的加载失败场景 - 跳过空行:避免对空白行做无效解析,提升效率
- 错误提示清晰:控制台会打印具体错误信息和行号,便于排查问题
额外优化建议
优先确认文件编码:如果大量行都出现解码错误,大概率是文件本身不是UTF-8编码(比如GBK、GB2312)。这时候可以直接指定正确编码打开文件,从根源解决问题:
with open("your_file.json", "r", encoding="gbk") as fin: result = load_from_json(fin)错误日志记录:如果需要长期留存错误信息,可以把打印换成写入日志文件,比如:
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
相关产品推荐
相关产品推荐

