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

如何用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)
    以此类推覆盖所有对象。
实现方案

步骤说明

  1. 读取文件内容:读取目标文本文件,获取所有帧的原始数据字符串。
  2. 解析帧数据:将每个{}包裹的字符串转换为Python字典,方便提取每个对象的坐标。
  3. 按对象编号分组:用一个字典存储每个对象编号对应的所有坐标条目(保留编号: (x,y)的格式)。
  4. 写入文件:遍历分组后的字典,为每个对象生成对应的文件,写入其所有帧的坐标数据。

完整代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 15:45:32