Python实现文件转JSON时输出异常的排查与修复方法
问题原因
原代码存在两处核心逻辑错误:
- 对象分组逻辑完全失效:每次循环都新建空字典,非大括号行直接将空字典追加到结果列表,没有按照
{}作为对象边界做分组,导致每个键值对对应一个独立空对象。 - 缺少字符串清洗步骤:分割键值后没有去除首尾空白,也没有剔除值外层多余的双引号、末尾冗余逗号,导致输出的键带前置缩进空格、值携带多余符号和空白。
修复后完整代码
import json result = [] current_obj = None # 读取源文件 with open("log.file", "r", encoding="utf-8") as f: for line in f: line_stripped = line.strip() # 匹配对象起始边界,初始化新对象 if line_stripped.startswith("{"): current_obj = {} continue # 匹配对象结束边界,将完整对象存入结果 if line_stripped.startswith("}"): if current_obj is not None: result.append(current_obj) current_obj = None continue # 跳过空行 if not line_stripped: continue # 按冒号分割键值,最多分割1次避免值内含冒号时报错 key, val = line_stripped.split(":", 1) # 清洗键:去除首尾空白 key = key.strip() # 清洗值:去除首尾空白、末尾逗号、外层包裹的双引号 val = val.strip() if val.endswith(","): val = val[:-1].strip() if val.startswith('"') and val.endswith('"'): val = val[1:-1].strip() # 键值写入当前对象 current_obj[key] = val # 写出符合要求的JSON文件 with open("json_log.json", "w", encoding="utf-8") as out_f: json.dump(result, out_f, indent=4, ensure_ascii=False)
修复说明
- 重新设计对象分组逻辑:以
{作为单条记录的起始标记初始化空字典,以}作为单条记录的结束标记将填充完成的字典追加到结果列表,保证同属一个大括号的键值对归入同一对象。 - 补全字符串清洗流程:所有键、值在写入字典前统一去除首尾空白,自动剔除值末尾的冗余逗号、外层包裹的多余双引号,输出格式完全匹配预期要求。
- 优化边界处理:
split方法增加maxsplit=1参数避免值内包含冒号时触发分割错误,使用上下文管理器处理文件读写自动释放资源,兼容空行场景。
内容的提问来源于stack exchange,提问作者learner22
相关产品推荐
相关产品推荐

