首页 > 解决方案 > 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

我想在同一个地方添加 和 的值和其他A3A1AA3A1B

我尝试了以下方法:

    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 

但这不起作用

标签: pythonyamlpyyaml

解决方案


这里有几个问题:

  • 您的 YAML 无效。键与(或)A3不对齐。我假设您希望它与A2A2BA2
  • 根级映射中的 keyA不是A1,所以你应该从 foobar['A']遍历数据结构开始。
  • 没有[*]用于.items()获取键值对或.values()仅获取嵌套映射/字典的值之类的东西
  • 您的for语句缩进不正确
  • 您正在使用 PyYAML load() ,它被记录为可能不安全,因此无需使用它。使用safe_load()或升级到ruamel.yamlYAML 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

推荐阅读