如何使用PyYAML加载多个yaml文件?

3

我有一系列yaml文件,希望能够加载并将它们的内容返回到一个字典中。

最简单的方法是通过循环遍历文件名,并使用safe_load逐个加载,然后合并结果字典。 不过,我想知道Python的yaml库是否已经具备了这种功能。我看到有load_allsafe_load_all方法,但它们仍然只接受一个流,所以我不确定是否或如何使用它们。


load_allsafe_load_all方法将返回一个文档列表。如果您想要多个文件的相同结果,只需将每个文件附加到列表中即可。如果您想要一个单独的字典,您需要确定合并策略(所有输入文件是否相关?合并它们是否有意义?在出现冲突键时应该发生什么?) - larsks
1个回答

2
这个 "stream" 术语有点误导人。对于 PyYaml 库,您可以将其视为包含多个 yaml 文档的字符串(或文件),例如下面这个例子:
field1: foo
field2: bar
---
field1: baz
field2: qux
field3: fred
---
field4: fred

要使用load_all(或safe_load_all)来处理多个文件中拆分的多个文档,您需要以某种形式将它们连接起来。 函数load_all本身不能直接从文件夹中一次读取多个文件。
简而言之,您有两个选择:
1.使用循环或列表推导来迭代文件,调用read()方法,然后逐个使用yaml.load进行处理。
2.使用循环或列表推导来迭代文件并将它们连接成一个字符串,格式如上所示(使用\n---\n分隔文档),然后使用yaml.load_all进行处理。
如果您有一种方法可以从一个单独的文件和多个文档开始(而不是多个文件),则可以直接在该文件上使用yaml.load_all
重要的是要注意,yaml.load_all向您返回一个生成器。 迭代此生成器会为您带来每个---之间的每个文档的字典。 您可以通过将第一个字典分配给变量,然后对生成器内的每个下一个字典调用.update()方法来实现合并。
gen = yaml.load_all(string)
starting_dict = next(gen)
for d in gen:
    starting_dict.update(d)

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