如何用Python脚本将Vivado仿真日志转为指定格式JSON?
转换Vivado冒号分隔日志为指定JSON格式
我有一份Vivado模拟器生成的日志文件,希望将其转换为指定格式的JSON以用于可视化。此前查找的日志转JSON方案多针对CSV格式,而我的日志为冒号分隔。
日志示例行:
OVL_ERROR : ASSERT_NO_OVERFLOW : Counter did not reset after reaching Threshold : Test expression changed value from allowed maximum value max to a value in the range max+1 to min : severity 1 : time 430000 : counter_tb.no_overflow.ovl_error_t期望转换后的JSON格式:
{ "Error":"OVL_ERROR", "Assertion":"ASSERT_NO_OVERFLOW", "Message":"Counter_did_not_reset_after_reaching_Threshold", "Coverage":"Test expression changed value from allowed maximum value max to a value in the range max+1 to min", "Severity":"1", "Time":"430000" }
Python实现代码
import json def parse_vivado_log_line(line): # 按" : "分割行,同时去除每个字段的首尾空格,过滤空内容 parts = [segment.strip() for segment in line.split(" : ") if segment.strip()] # 映射日志字段到目标JSON结构 log_entry = { "Error": parts[0], "Assertion": parts[1], "Message": parts[2].replace(" ", "_"), "Coverage": parts[3], "Severity": parts[4].split()[1], "Time": parts[5].split()[1] } return log_entry def convert_log_to_json(input_path, output_path): log_entries = [] with open(input_path, 'r', encoding='utf-8') as log_file: for line_num, line in enumerate(log_file, 1): stripped_line = line.strip() if not stripped_line: continue try: entry = parse_vivado_log_line(stripped_line) log_entries.append(entry) except (IndexError, ValueError) as e: print(f"第{line_num}行格式异常,跳过: {stripped_line} | 错误信息: {str(e)}") # 写入格式化后的JSON文件 with open(output_path, 'w', encoding='utf-8') as json_file: json.dump(log_entries, json_file, indent=4) # 执行转换(替换为你的日志文件路径和输出路径) if __name__ == "__main__": convert_log_to_json("vivado_sim.log", "visualization_data.json")
代码说明
- 字段分割:使用
" : "作为分隔符,避免误分割日志内容中可能存在的冒号 - 字段映射:
- 将
Message字段的空格替换为下划线,匹配目标格式要求 - 从
severity X和time X格式的字段中提取数值部分
- 将
- 异常处理:捕获格式错误的行并打印提示,避免程序中断
- 编码兼容:指定
utf-8编码处理日志文件,避免中文或特殊字符乱码
内容的提问来源于stack exchange,提问作者Sujan SM
相关产品推荐
相关产品推荐

