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

Python读取含非UTF字符的二进制JSON文本文件,如何转为字典?

解决含非UTF字符的连续JSON字节解析问题

我来帮你搞定这个问题!你遇到的核心问题有两个:一是多个JSON连续排列没有分隔符,二是非UTF字符导致常规json库解析失败。下面是一步步的实操方案:

第一步:读取完整字节内容,避免逐行拆分JSON

首先不要逐行读取!因为单个JSON可能被换行符拆分成多行,直接读取整个文件的字节内容更稳妥:

with open('your_target_file.txt', 'rb') as f:
    raw_byte_data = f.read()

第二步:分割连续的JSON字节块

因为文件里的JSON是{...}{...}{...}这种连续格式,我们可以通过括号匹配的方式,把字节流分割成单个完整的JSON字节块:

def split_continuous_json_bytes(byte_data):
    json_blocks = []
    brace_counter = 0
    start_pos = 0
    for idx, byte in enumerate(byte_data):
        if byte == ord(b'{'):
            brace_counter += 1
        elif byte == ord(b'}'):
            brace_counter -= 1
            # 当括号计数归0时,说明找到一个完整的JSON
            if brace_counter == 0:
                json_block = byte_data[start_pos:idx+1]
                json_blocks.append(json_block)
                start_pos = idx + 1
    return json_blocks

# 得到单个JSON字节块列表
json_byte_blocks = split_continuous_json_bytes(raw_byte_data)

第三步:解析含非UTF字符的JSON字节块

json.loads()其实支持直接传入字节数据,并且可以通过encoding参数指定编码,完美解决非UTF字符的问题。这里提供两种方案:

方案1:自动检测编码(更精准)

用chardet库检测每个JSON块的编码(需要先安装:pip install chardet):

import json
import chardet

parsed_dicts = []
for block in json_byte_blocks:
    # 检测当前块的编码
    detect_result = chardet.detect(block)
    target_encoding = detect_result['encoding']
    try:
        # 用检测到的编码解析
        data_dict = json.loads(block, encoding=target_encoding)
        parsed_dicts.append(data_dict)
    except (UnicodeDecodeError, json.JSONDecodeError) as e:
        # 检测失败时,用latin-1兜底(兼容所有字节)
        print(f"Failed with {target_encoding}, fallback to latin-1: {e}")
        data_dict = json.loads(block, encoding='latin-1')
        parsed_dicts.append(data_dict)

方案2:直接用latin-1兜底(更简单)

如果不需要精准编码,latin-1是万能兜底选择——它能将任意字节解码为对应的Unicode字符,不会抛出解码错误:

import json

parsed_dicts = []
for block in json_byte_blocks:
    try:
        # 先尝试UTF-8,失败则用latin-1
        data_dict = json.loads(block)
        parsed_dicts.append(data_dict)
    except UnicodeDecodeError:
        data_dict = json.loads(block, encoding='latin-1')
        parsed_dicts.append(data_dict)
    except json.JSONDecodeError as e:
        print(f"Skip invalid JSON block: {e}")

为什么这么做?

  • 直接操作字节避免了提前解码导致的错误,json.loads的encoding参数会在解析时正确处理字节到JSON的转换
  • 括号匹配的分割方式比按空格/换行分割更可靠,能准确识别每个完整的JSON结构
  • latin-1作为兜底,保证不会因为编码问题丢失整个JSON的结构,只是非UTF字符可能显示为特殊符号但数据结构完整

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:59:10