我正在做一个简单的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'}
我知道有几种方法可以解决问题,用零替换括号或使用迭代循环来创建一个新对象,但这看起来真的很复杂。有没有更好的方法可以获得我正在寻找的结果,而不会跳过篮球并创建更难以阅读的代码?
答案 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读取" - "作为列表元素,而没有" - "被读作字典元素。