Python 遍历 YAML
Python iterate through YAML
如何遍历:
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
但这行不通
这里有几个问题:
- 您的 YAML 无效。键
A3
与 A2
(或 A2B
)不对齐。我假设
你希望它与 A2
对齐
- 根级别映射中的键是
A
而不是 A1
,因此您应该从
foobar['A']
遍历数据结构
- 不存在
[*]
使用 .items()
获取键值对,或 .values()
只获取嵌套的 mapping/dict 的值
- 您的
for
语句缩进不正确
- 您正在使用 PyYAML 的
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
如何遍历:
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
但这行不通
这里有几个问题:
- 您的 YAML 无效。键
A3
与A2
(或A2B
)不对齐。我假设 你希望它与A2
对齐
- 根级别映射中的键是
A
而不是A1
,因此您应该从foobar['A']
遍历数据结构 - 不存在
[*]
使用.items()
获取键值对,或.values()
只获取嵌套的 mapping/dict 的值
- 您的
for
语句缩进不正确 - 您正在使用 PyYAML 的
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