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

我想在同一个地方添加 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 

但这行不通

这里有几个问题:

  • 您的 YAML 无效。键 A3A2(或 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