将yaml列表加载为字典

时间:2017-11-15 18:18:25

标签: python-3.x yaml

我正在做一个简单的yaml加载并遇到一个小问题:

代码:

with open(target, 'r') as stream:
    try:
        data = (yaml.load(stream))
    except Exception as exc:
        print (exc)

print(data)

第一个yaml文件:

test:
  - foo: 1
  - bar: 2
test2:
  - foo: 1
  - bar: 2

第二个yaml文件:

foo: 1
bar: 2

我只需要测试组中的值,所以当我尝试从第一个yaml访问数据时,我使用print(data['test'])返回这些值:

[{'foo': '1'}, {'bar': '2'}]

在第二个,我使用print(data)行,我得到:

{'foo': '1'}, {'bar': '2'}

我知道有几种方法可以解决问题,用零替换括号或使用迭代循环来创建一个新对象,但这看起来真的很复杂。有没有更好的方法可以获得我正在寻找的结果,而不会跳过篮球并创建更难以阅读的代码?

2 个答案:

答案 0 :(得分:2)

您将获得正在阅读的yaml数据的字典。

{'test': [{'foo': 1}, {'bar': 2}], 'test2': [{'foo': 1}, {'bar': 2}]}

如果您想将test组的值作为字典获取,则需要手动将字典列表创建为字典。

dicta = {k:v for d in data['test'] for k, v in d.items()}
print(dicta) # {'foo': 1, 'bar': 2}

答案 1 :(得分:1)

还有另一种方式。基于yaml文件语法。请在您的yaml文件中使用此格式。

test:
  foo: 1
  bar: 2
test2:
  - foo: 1
  - bar: 2

通过这个你可以调用你的foo测试词典。

>>>print(data[test][foo])
1

这是因为yaml读取" - "作为列表元素,而没有" - "被读作字典元素。