作为我上一个[Loading and dumping multiple yaml files with ruamel.yaml (python)](https://stackoverflow.com/questions/52943337/loading-and-dumping-multiple-yaml-files-with-ruamel-yaml-python问题的后续,我现在尝试将条目插入到树中。我使用CommentedMaps()
,这样我也可以在树中插入自己的锚/引用。
代码的相关部分:如果还没有用户: tree,我创建如下:
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
发布于 2018-10-25 10:39:43
您只在配额行之后保留)
,从而手动包装“)
”。如果您对"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)
https://stackoverflow.com/questions/52985851
复制相似问题