【问题标题】:Python iterate through YAMLPython 遍历 YAML
【发布时间】:2019-08-04 15:37:09
【问题描述】:

如何迭代:

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】:

    这里有几个问题:

    • 您的 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
    

    【讨论】:

    • 谢谢你为我做的。还考虑了您的其他提示。
    猜你喜欢
    • 2018-01-09
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 2023-01-05
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    相关资源
    最近更新 更多