将yaml列表作为字典加载

3
我正在进行一个简单的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'}

我知道一些解决问题的方法,比如用空字符串替换括号,或者使用迭代循环创建一个新对象,但这似乎非常复杂。有没有更好的方法可以得到我想要的结果,而不需要跳过许多障碍并创建更难阅读的代码?

我知道几种解决问题的方法。这里的问题是什么? - bhansa
1
数据已经格式化为列表,我想将其转换为字典格式,但不想使用循环来实现。 - Merakel
@Merakel 如果你有一个 YAML 映射序列,你会在 Python 中得到一个字典列表。你需要自己处理数据。或者你可以尝试在第一个文件的列表中添加 !!omap 标签,然后你会得到一个 ordereddict - tinita
2个回答

4

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

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

使用这个功能,您可以调用您的foo测试字典。

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

这是因为yaml将“ - ”读作列表元素,而没有“ - ”的元素被读作字典元素。

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}

@Merakel,你对此有任何评论吗?请告诉我。 - bhansa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接