如何用Python生成指定结构的紧凑列表格式YAML文件
如何修改Python代码生成期望的YAML格式?
问题场景
你编写了以下Python代码保存数据到YAML文件:
dict = { i: [{'cam_R_m2c': cam_R_m2c}, {'cam_T_m2c': cam_T_m2c}, {'obj_bb': [0, 0, 0, 0]}, {'obj_id': 0} ] } # list = [{'cam_R_m2c':cam_R_m2c},{'cam_T_m2c':cam_T_m2c},{'obj_bb': [0,0,0,0]},{'obj_id': 0}] with open('./Data_collection/gt.yml','a+') as f: yaml.dump(dict,f)
当前生成的YAML格式不符合预期:
0: - cam_R_m2c: - 0.999988853931427 - -0.0014960498083382845 - -0.004474445711821318 - 0.0014844260876998305 - 0.9999955296516418 - -0.0025999906938523054 - 0.004478315357118845 - 0.0025933198630809784 - 0.9999865889549255 - cam_T_m2c: - 0.014818123541772366 - 9.016657713800669e-05 - 0.00015443217125721276 - obj_bb: - 0 - 0 - 0 - 0 - obj_id: 0
你期望生成的YAML格式为:
0: - cam_R_m2c: [0.09630630, 0.99404401, 0.05100790, 0.57332098, -0.01350810, -0.81922001, -0.81365103, 0.10814000, -0.57120699] cam_t_m2c: [-105.35775150, -117.52119142, 1014.87701320] obj_bb: [244, 150, 44, 58] obj_id: 1
修改方案
需要从数据结构调整和YAML输出参数设置两方面修改:
1. 修正数据结构
当前代码中,i对应的是包含4个独立字典的列表,这会导致YAML生成4个列表项。你需要把这些键值对合并到同一个字典中,再放在列表里:
# 避免使用内置类型名dict作为变量名 data = { i: [{ 'cam_R_m2c': cam_R_m2c, 'cam_T_m2c': cam_T_m2c, 'obj_bb': [0, 0, 0, 0], 'obj_id': 0 }] }
2. 设置YAML输出参数
PyYAML默认会把长列表展开为多行,需要设置default_flow_style=None让列表自动以方括号的行内格式输出:
with open('./Data_collection/gt.yml','a+') as f: yaml.dump(data, f, default_flow_style=None)
完整修改后的代码
# 假设cam_R_m2c和cam_T_m2c已经提前定义 data = { i: [{ 'cam_R_m2c': cam_R_m2c, 'cam_T_m2c': cam_T_m2c, 'obj_bb': [0, 0, 0, 0], 'obj_id': 0 }] } with open('./Data_collection/gt.yml','a+') as f: yaml.dump(data, f, default_flow_style=None)
说明
default_flow_style=None:让PyYAML根据内容长度自动选择格式,短结构用行内(方括号),长结构保持块格式,正好匹配你期望的输出。- 避免用
dict作为变量名,防止覆盖Python内置的dict类型引发意外问题。
内容的提问来源于stack exchange,提问作者darrenxc
相关产品推荐
相关产品推荐

