Python 使用泛型构造函数读取yaml文件
我需要使用pyyaml包读取python中的AWS cloudformation文件。这个问题似乎已经用这个代码片段解决了Python 使用泛型构造函数读取yaml文件,python,pyyaml,Python,Pyyaml,我需要使用pyyaml包读取python中的AWS cloudformation文件。这个问题似乎已经用这个代码片段解决了 def generic_constructor(loader, tag, node): classname = node.__class__.__name__ if (classname == 'SequenceNode'): return loader.construct_sequence(node) elif (classname
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文件
问题已在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\u加载(打开文件或字符串)
加载数据
使用ruamel.yaml(免责声明:我是该软件包的作者)可能更容易,默认情况下,它可以处理特殊标签(包括AWS的标签),不过您应该指定十年前过时的yaml 1.1版本(这是AWS所期望的,也是PyYAML唯一支持的)
其中
x
可以是pathlib.Path()
实例、打开的文件或字符串。代码在哪里?不适用于该代码的示例AWS代码段在哪里?
from ruamel.yaml import YAML
yaml = YAML()
yaml.version = (1, 1)
data = yaml.load(x)