如何迭代:
A:
A1: 1000
A2:
A2A:
A2A1: 100
A2A2: 250
A2A3: 250
A2B:
A2B1: 100
A2B2: 300
A3:
A3A:
A3A1:
A3A1A: 200
A3A1B: 100
# There could be more values
我想在同一个地方添加A3A1A
和A3A1B
的值以及其他值
我尝试了以下方法:
with open("foobar.yml", 'r') as stream:
foobar = yaml.load(stream)
end_value = 0
for one_value in foobar["A1"]["A3"]["A3A"] ["A3A1"][*]:
end_value = end_value + one_value
但这不起作用
这里有几个问题:
A3
与A2
(或A2B
)不对齐。我假设你想要它与A2
对齐A
而不是A1
,因此您应该从foobar['A']
开始遍历数据结构。[*]
使用.items()
获取键值对,或.values()
只能获取嵌套映射/字典的值for
语句缩进不正确load()
,据说它可能不安全,而且不需要使用它。使用safe_load()
,或升级到ruamel.yaml
,它为您提供YAML 1.2等等(免责声明:我是ruamel.yaml的作者)例如。你可以做:
import sys
import ruamel.yaml
yaml = ruamel.yaml.YAML(typ='safe')
with open('foobar.yaml') as fp:
data = yaml.load(fp)
end_value = 0
for one_value in data['A']['A3']['A3A']['A3A1'].values():
end_value += one_value
print(end_value)
这使:
300