如何用Python按对象编号拆分视频帧坐标数据至独立文件?
问题描述
现有一文本文件,内容结构如下(每一个{}包裹的内容代表单帧视频中所有车辆对象的x,y坐标,:前的数字为对象编号):
{0: (566, 906), 1: (434, 750), 2: (1021, 649), 3: (857, 567), 4: (761, 654), 5: (929, 534), 6: (1418, 465), 7: (1345, 985), 8: (753, 465), 9: (134, 522), 10: (614, 473), 11: (1868, 591), 12: (881, 473), 13: (1112, 434), 14: (688, 451), 15: (843, 423)} {0: (563, 920), 1: (429, 755), 2: (1023, 652), 3: (859, 569), 4: (761, 659), 5: (931, 536), 6: (1410, 465), 7: (1363, 988), 8: (753, 466), 9: (134, 522), 10: (613, 475), 11: (1858, 584), 12: (881, 474), 13: (1109, 434), 14: (688, 452), 16: (1702, 617), 17: (945, 463), 18: (820, 400)} {0: (558, 934), 1: (424, 763), 2: (1025, 653), 3: (861, 572), 4: (762, 663), 5: (931, 537), 6: (1404, 463), 7: (1379, 993), 8: (753, 466), 9: (134, 522), 10: (613, 476), 11: (1849, 578), 12: (881, 475), 13: (1101, 431), 14: (688, 453), 17: (947, 464), 19: (1677, 610)}
需要用Python实现:将所有车辆对象按编号分组,把每个对象在所有帧中的坐标保存至单独文件。预期输出示例:
file1.text:保存对象编号0的所有帧坐标,格式为0: (566, 906) 0: (563, 920) 0: (558, 934)file2.text:保存对象编号1的所有帧坐标,格式为1: (434, 750) 1: (429, 755) 1: (424, 763)
以此类推覆盖所有对象。
实现方案
步骤说明
- 读取文件内容:读取目标文本文件,获取所有帧的原始数据字符串。
- 解析帧数据:将每个
{}包裹的字符串转换为Python字典,方便提取每个对象的坐标。 - 按对象编号分组:用一个字典存储每个对象编号对应的所有坐标条目(保留
编号: (x,y)的格式)。 - 写入文件:遍历分组后的字典,为每个对象生成对应的文件,写入其所有帧的坐标数据。
完整代码
import ast # 1. 读取文件内容(替换为你的输入文件路径) with open('input.txt', 'r', encoding='utf-8') as f: content = f.read().strip() # 2. 分割并解析每帧数据 frame_strings = content.split('} {') # 处理首尾的{}符号,确保每个子串能正确转换为字典 frame_strings[0] = frame_strings[0].strip('{') frame_strings[-1] = frame_strings[-1].strip('}') frames = [ast.literal_eval('{' + s + '}') for s in frame_strings] # 3. 按对象编号分组存储坐标条目 object_coords = {} for frame in frames: for obj_id, coord in frame.items(): # 格式化保留原始样式的条目字符串 entry = f"{obj_id}: {coord}" if obj_id not in object_coords: object_coords[obj_id] = [] object_coords[obj_id].append(entry) # 4. 写入每个对象的文件 for obj_id, entries in object_coords.items(): # 文件名按对象编号排序,file1对应id0,file2对应id1,以此类推 file_name = f"file{obj_id + 1}.text" with open(file_name, 'w', encoding='utf-8') as f: # 写入说明行和坐标内容 f.write(f"对象编号{obj_id}及其在所有帧中的坐标\n") f.write(' '.join(entries))
代码说明
- 使用
ast.literal_eval安全解析字符串为字典,避免eval的安全风险。 - 分割帧数据时处理了首尾的
{},确保每个子串能正确转换为字典。 - 文件名按
fileN.text命名,其中N为对象编号+1(对应示例中的file1对应id0)。 - 每个文件先写入对象说明,再写入所有帧的坐标条目,用空格分隔。
内容的提问来源于stack exchange,提问作者Eslam Esmaeal
相关产品推荐
相关产品推荐

