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
相关产品推荐
相关产品推荐

