ruamel.yaml中CommentedMap.keys()是否保留插入顺序?
ruamel.yaml CommentedMap 键顺序问题解答
- 核心结论:
CommentedMap的keys()方法返回的键严格保留原YAML文件中的定义顺序,转换成列表后仍会维持该顺序。 - 底层逻辑:ruamel.yaml的
CommentedMap基于OrderedDict(兼容Python 3.7+原生dict的有序特性)实现,核心设计目标就是保留YAML文件的原始结构、键顺序及注释信息。
验证代码示例
from ruamel.yaml import YAML # 模拟带注释的YAML内容 yaml_content = """settings: # 这是key2的注释 key2: value2 # 这是key1的注释 key1: value1 """ yaml = YAML() data = yaml.load(yaml_content) settings_map = data['settings'] # 转换为列表后保留原顺序 keys_list = list(settings_map.keys()) print(keys_list) # 输出结果: ['key2', 'key1']
调整键顺序的实操方法
如果需要将key1调整到key2前面,有两种可靠方式:
- 方法1:使用内置move_to_end方法
# 将key1移到CommentedMap的最前面 settings_map.move_to_end('key1', last=False)
- 方法2:手动构建新的CommentedMap(适合复杂顺序调整)
from ruamel.yaml.comments import CommentedMap new_settings = CommentedMap() # 按指定顺序添加键,并同步迁移注释 new_settings['key1'] = settings_map['key1'] new_settings.yaml_set_comment_before_key('key1', settings_map.yaml_comment_before_key('key1')) new_settings['key2'] = settings_map['key2'] new_settings.yaml_set_comment_before_key('key2', settings_map.yaml_comment_before_key('key2')) # 替换原settings节点 data['settings'] = new_settings # 写入调整后的YAML文件 yaml.dump(data, open('adjusted.yaml', 'w'))
注意:调整键顺序时必须同步处理注释,ruamel.yaml提供的
yaml_set_comment_before_key、yaml_add_eol_comment等方法可确保注释完整保留。
内容的提问来源于stack exchange,提问作者Manuelarte
相关产品推荐
相关产品推荐

