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

Python如何动态创建JSON文件并将结构化日志转换为指定JSON数组格式

问题根因

你当前的代码没有达到预期效果,核心问题有3个:

  • 没有先判断目标JSON文件是否存在就直接写入,不符合“目标文件不存在才生成”的需求
  • 直接逐行写入序列化后的JSON对象,没有外层数组包裹,也没有在多个对象之间补充逗号分隔符
  • 没有设置json.dumps的缩进参数,输出的是压缩后的单行JSON,不是你要的格式化结构

实现代码

import os
import json

# 统一声明路径,避免变量混淆
log_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'logs', 'test_log.log'))
# 注意:如果你的log_file_path是目标JSON所在的父目录,这里保留即可,否则调整为对应目录
target_json_path = os.path.abspath(os.path.join(log_file_path, 'test_log.json'))

# 仅在目标文件不存在时执行生成逻辑
if not os.path.exists(target_json_path):
    log_json_list = []
    # 逐行读取日志转成字典存入列表
    with open(log_path, 'r', encoding='utf-8') as log_file:
        for line in log_file:
            cleaned_line = line.lstrip('\x00').strip()
            # 跳过空行避免解析报错
            if not cleaned_line:
                continue
            log_json_list.append(json.loads(cleaned_line))
    # 一次性序列化列表写入文件,自动生成符合要求的格式
    with open(target_json_path, 'w', encoding='utf-8') as json_file:
        json.dump(log_json_list, json_file, indent=2, ensure_ascii=False)

改动说明

  • 通过os.path.exists判断目标文件状态,仅不存在时才生成,符合需求
  • 先把所有日志行的JSON对象存入Python列表,再整体序列化,会自动生成外层数组结构、自动在对象之间加逗号分隔
  • 增加indent=2参数实现缩进格式化,和你预期的输出结构一致
  • 增加ensure_ascii=False参数,避免后续日志出现中文时乱码
  • 增加空行过滤逻辑,避免日志中的空行导致JSON解析异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:42:02