python - Python 遍历 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
- 根级映射中的 key
A
不是A1
,所以你应该从foobar['A']
遍历数据结构开始。 - 没有
[*]
用于.items()
获取键值对或.values()
仅获取嵌套映射/字典的值之类的东西 - 您的
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
推荐阅读
- javascript - 在codeigniter的单个复选框中插入多条记录?
- python-3.x - 具有> 3个特征的分层凝聚聚类
- javascript - Javascript 文件加载其他 Javascript 文件没有窗口/文档
- python - Replace ones in binary columns with values from another column
- php - PHP get_class 错误将 SimpleXML 转换为数组
- r - 如何在 R 的滚动窗口中跳过 NA 列
- html - html5 MKV 带字幕播放
- model-view-controller - Opencart 无法在视图中显示从控制器发送的变量
- php - PHP Dropdown,如何获取选定的文本?
- django - 不同的字段类型序列化器 - Django Rest Framework