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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 00:36:19