Python迭代YAML

问题描述 投票:1回答:1

如何迭代:

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 

但这不起作用

python yaml pyyaml
1个回答
2
投票

这里有几个问题:

  • 您的YAML无效。关键的A3A2(或A2B)不对齐。我假设你想要它与A2对齐
  • 根级别映射中的关键是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
© www.soinside.com 2019 - 2024. All rights reserved.