如何让yaml.dump输出OrderedDict时格式与普通Dict一致?
你不需要手动遍历转换所有OrderedDict,有3种更简便的实现方案:
方案1:注册PyYAML自定义序列化规则(推荐,无侵入)
直接给PyYAML全局注册OrderedDict的序列化映射规则,让它和普通dict输出格式一致,同时保留键的原有顺序:
import yaml from collections import OrderedDict # 注册OrderedDict的序列化规则 def ordered_dict_representer(dumper, data): return dumper.represent_mapping('tag:yaml.org,2002:map', data.items()) yaml.add_representer(OrderedDict, ordered_dict_representer) # 序列化时额外添加sort_keys=False参数,避免键被自动排序 yaml.dump(your_data, sort_keys=False, allow_unicode=True)
运行后输出的格式就和普通dict完全一致,符合你需要的可读性要求。
方案2:嵌套结构批量转换为普通dict
如果不想修改PyYAML的全局配置,可以写一个递归转换函数处理嵌套的OrderedDict:
from collections import OrderedDict def convert_ordered_to_dict(obj): if isinstance(obj, OrderedDict): return {k: convert_ordered_to_dict(v) for k, v in obj.items()} elif isinstance(obj, list): return [convert_ordered_to_dict(item) for item in obj] else: return obj # 转换后再序列化 normal_data = convert_ordered_to_dict(your_data) yaml.dump(normal_data, sort_keys=False)
方案3:使用替代序列化库
可以直接用ruamel.yaml库,它原生支持保留字典顺序的序列化,无需额外配置,OrderedDict会自动按普通映射格式输出:
import ruamel.yaml from collections import OrderedDict yaml = ruamel.yaml.YAML() yaml.dump(your_data, open("output.yaml", "w"))
内容的提问来源于stack exchange,提问作者Cornelius Roemer
相关产品推荐
相关产品推荐

