使用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
相关产品推荐
相关产品推荐

