使用ruamel CommentedMap()手动添加项目

时间:2018-10-25 09:25:35

标签: python-2.7 ruamel.yaml

作为我之前的[Loading and dumping multiple yaml files with ruamel.yaml (python)问题的跟进),我现在尝试将项目插入树中。我正在使用CommentedMaps(),因此也可以在树中插入自己的锚点/引用。

代码的相关部分: 如果没有用户:树还存在,我创建这个:

if 'users' not in merged_yaml:
    merged_yaml['users'] = [ CommentedMap() ]
    merged_yaml['users'][0].yaml_set_anchor('users')

然后将其添加为

merged_yaml['users'][0][user_name] = CommentedMap({'timestamp': current_date}, relax=True)
merged_yaml['users'][0][user_name].add_yaml_merge([(0, userdefaults)])

因此,尽管这样做有效,但结果却不一致,如您所见( pprint(merged_yaml['users'])-手动缩进)。问题在于user3被合并到user2的地图内。

[ordereddict([
    ('user1', ordereddict([
        ('timestamp', '2018-10-25 11:16:42.132415'), 
        ('files', 1000), 
        ('quota', 200)
    ])), 
    ('user2', ordereddict([
        ('timestamp', '2018-10-25 11:16:42.132415'), 
        ('files', 1000), 
        ('quota', 200)
     ])), 
     ('user3', ordereddict([
         ('timestamp', '2018-10-25 11:16:42.132415'), 
         ('files', 1000), 
         ('quota', 200)
     ]))
    ])
]

我一直在试图找出我在做什么错,但我无法发现它。

users:
-   user1:
        <<: *userdefaults
        timestamp: '2018-10-25 11:16:42.132415'
    user2:
        <<: *userdefaults
        timestamp: '2018-10-25 11:16:42.132415'
    user3:
        <<: *userdefaults
        timestamp: '2018-10-25 11:16:42.132415'

我期望的是:

[ordereddict([
    ('user1', ordereddict([
    ....
    ]))
]),
ordereddict([
    ('user2', ordereddict([
    ....
    ]))
])
]

users:
-   user1:
        <<: *userdefaults
        timestamp: '2018-10-25 11:16:42.132415'
-    user2:
        <<: *userdefaults
        timestamp: '2018-10-25 11:16:42.132415'
-    user3:
        <<: *userdefaults
        timestamp: '2018-10-25 11:16:42.13241

1 个答案:

答案 0 :(得分:1)

您只在配额行之后留了)来手动包装“ user1”。 如果您对“ user2”的配额行执行相同的操作,并且还将“ user3”的配额放在换行符上,则会看到缩进 在解释输出时会使您失去平衡。

[ordereddict([
    ('user1', ordereddict([
        ('timestamp', '2018-10-25 11:16:42.132415'), 
        ('files', 1000), 
        ('quota', 200)
    ])), 
#     ^ closing for tuple
#    ^ closing for ordereddict
#   ^ closing for list of ordereddict tuples
    ('user2', ordereddict([
        ('timestamp', '2018-10-25 11:16:42.132415'), 
        ('files', 1000), 
        ('quota', 200)
    ])), 
        ('user3', ordereddict([
            ('timestamp', '2018-10-25 11:16:42.132415'), 
            ('files', 1000), 
            ('quota', 200)
        ]))
#   ^^^^ extra indent in 5 preceding lines
    ])
]

基于期望的输出,您希望每个序列元素一个映射,而您的序列具有多个元素。为此,在Python中,您需要将CommentedMap附加到列表中:

merged_yaml['users'] = x = []
for user in users:
   cm = CommentedMap()
   cm[user] = CommentedMap({'timestamp': current_date}, relax=True)
   cm.add_yaml_merge([(0, userdefaults)])    
   x.append(cm)