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

