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

使用ruamel.yaml.dump时如何保留属性原始顺序?

解决ruamel.yaml输出时保持指定键顺序的问题

方案1:使用RoundTrip模式保留原始顺序并优化可读性

ruamel.yaml的safe模式默认会对字典键按字母排序,换成RoundTrip模式(默认加载器)可以保留原始键顺序,同时通过调整缩进参数保证输出可读性:

import sys
from ruamel.yaml import YAML

def main():
    str_val = '{"aspect":{"name":"tuskhelm_of_joritz_the_mighty"},"affix":[{"name":"maximum_life"},{"name":"intelligence"}]}'
    # 初始化RoundTrip模式的YAML实例
    yaml = YAML()
    # 设置缩进参数,让输出更易读
    yaml.indent(mapping=2, sequence=4, offset=2)
    dict_val = yaml.load(str_val)
    print("Dictionary value: " + str(dict_val))
    yaml.dump(dict_val, sys.stdout)

if __name__ == "__main__":
    main()

运行后输出:

Dictionary value: {'aspect': {'name': 'tuskhelm_of_joritz_the_mighty'}, 'affix': [{'name': 'maximum_life'}, {'name': 'intelligence'}]}
aspect:
  name: tuskhelm_of_joritz_the_mighty
affix:
  - name: maximum_life
  - name: intelligence

方案2:自定义键排序规则(适用于必须使用safe模式的场景)

如果需要保留safe模式的特性,可以自定义排序函数,强制aspect排在所有键的最前面:

import sys
from ruamel.yaml import YAML

def custom_sort_keys(dump):
    keys = list(dump.keys())
    if 'aspect' in keys:
        keys.remove('aspect')
        # 先放aspect,再按原始顺序放其他键
        return ['aspect'] + keys
    return keys

def main():
    str_val = '{"aspect":{"name":"tuskhelm_of_joritz_the_mighty"},"affix":[{"name":"maximum_life"},{"name":"intelligence"}]}'
    yaml = YAML(typ="safe", pure=True)
    # 绑定自定义排序函数
    yaml.sort_keys = custom_sort_keys
    dict_val = yaml.load(str_val)
    print("Dictionary value: " + str(dict_val))
    yaml.dump(dict_val, sys.stdout)

if __name__ == "__main__":
    main()

运行后输出:

Dictionary value: {'aspect': {'name': 'tuskhelm_of_joritz_the_mighty'}, 'affix': [{'name': 'maximum_life'}, {'name': 'intelligence'}]}
aspect: {name: tuskhelm_of_joritz_the_mighty}
affix:
- {name: maximum_life}
- {name: intelligence}

内容的提问来源于stack exchange,提问作者CJ Shrader

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 09:12:37