使用泛型构造函数读取 yaml 文件



我需要使用软件包pyyaml在python中读取AWS云形成文件。此问题似乎已使用此代码片段解决。

def generic_constructor(loader, tag, node):
classname = node.__class__.__name__
if (classname == 'SequenceNode'):
return loader.construct_sequence(node)
elif (classname == 'MappingNode'):
return loader.construct_mapping(node)
else:
return loader.construct_scalar(node)
yaml.add_multi_constructor('', generic_constructor)

如何使用此代码读取 yaml 文件?

https://github.com/yaml/pyyaml/issues/169

该问题已在 github 上关闭,这意味着此代码必须正常工作才能读取问题报告者链接的 yaml 文件。


答案是正确的。简而言之,工作的代码看起来像这样...

import yaml
def generic_constructor(loader, tag, node):
classname = node.__class__.__name__
if classname == "SequenceNode":
return loader.construct_sequence(node)
elif classname == "MappingNode":
return loader.construct_mapping(node)
else:
return loader.construct_scalar(node)
yaml.add_multi_constructor("", generic_constructor, Loader=yaml.SafeLoader)
with open("mytest.yaml") as f:
data = yaml.safe_load(f)

一般的想法是,你的代码使用以下方法导入 PyYAML:

import yaml

之后,您调用代码段,该代码段会修改默认加载器。由于 PyYAML 使用的默认加载程序在该问题关闭后已更改,因此最好明确指定例如SafeLoader

yaml.add_multi_constructor('', generic_constructor, Loader=SafeLoader)

,然后使用data = yaml.safe_load(open_file_or_string)加载数据。

使用 ruamel.yaml 可能更容易(免责声明:我是该软件包的作者(,默认情况下它可以处理特殊标签(包括 AWS 的标签(,尽管您应该指定十年过时的 YAML 1.1 版本(这是 AWS 所期望的,也是 PyYAML 唯一支持的东西(。

from ruamel.yaml import YAML
yaml = YAML()
yaml.version = (1, 1)
data = yaml.load(x)

其中x可以是pathlib.Path()实例、打开的文件或字符串。

最新更新