如何用Python拆分含标注的复杂JSON文件并提取label坐标
解决方案
原代码问题分析
- 未定义循环变量
i和j,无法遍历所有frames和annotations条目 - 缺少文件写入逻辑,既没法提取坐标数据,也不能完成JSON拆分
完整实现代码
场景1:提取所有标注坐标到CSV文件
如果只需要汇总所有标注的x/y/width/height坐标,生成CSV文件方便后续分析:
import json import csv # 读取原始JSON with open('annotation_2131424.json', 'r', encoding='utf-8') as f: raw_data = json.load(f) # 遍历收集坐标数据 coords_list = [] for frame_num, frame in enumerate(raw_data['frames']): for anno_num, anno in enumerate(frame['annotations']): label = anno['label'] coords_list.append({ 'frame_index': frame_num, 'annotation_index': anno_num, 'x': label['x'], 'y': label['y'], 'width': label['width'], 'height': label['height'] }) # 写入CSV with open('annotation_coords.csv', 'w', newline='', encoding='utf-8') as csv_file: writer = csv.DictWriter(csv_file, fieldnames=coords_list[0].keys()) writer.writeheader() writer.writerows(coords_list)
场景2:按Frame拆分原始JSON为独立文件
如果需要把每个Frame的完整信息(含对应标注)拆分成单独的JSON文件,可按以下代码实现:
import json # 读取原始JSON with open('annotation_2131424.json', 'r', encoding='utf-8') as f: raw_data = json.load(f) # 遍历每个Frame生成独立文件 for frame_num, frame in enumerate(raw_data['frames']): # 构造单Frame的JSON结构,保留原文件基础信息 single_frame_json = { 'id': raw_data['id'], 'file': raw_data['file'], 'metadata': raw_data['metadata'], 'frame': frame } # 生成输出文件名(可根据实际需求修改命名规则) output_path = f'annotation_frame_{frame_num}.json' with open(output_path, 'w', encoding='utf-8') as out_file: json.dump(single_frame_json, out_file, indent=2, ensure_ascii=False)
注意事项
- 如果你的
frames条目里自带frame_id字段,建议用该字段替换代码中的frame_num作为文件名,辨识度更高 - 处理超大型JSON文件时,推荐使用
ijson库逐行解析,避免内存溢出 - 若原始JSON结构有嵌套层级变动,需对应调整代码中的字段索引路径
内容的提问来源于stack exchange,提问作者heaven lee
相关产品推荐
相关产品推荐

