Python 分析带有感叹号的yaml时出错
正在尝试使用Python 分析带有感叹号的yaml时出错,python,yaml,pyyaml,mkdocs,Python,Yaml,Pyyaml,Mkdocs,正在尝试使用pyyaml解析mkdocs.yml文件。它包含如下代码段: foo: 表情符号索引:!!python/name:materialx.emoji.twemoji 当我跑步时: 以open(“test.yml”,“r”)作为流: 尝试: 打印(yaml.安全加载(流)) 除作为exc的yaml.YAMLError外: 打印(exc) 这会引发以下错误: could not determine a constructor for the tag 'tag:yaml.org,2002:
pyyaml
解析mkdocs.yml
文件。它包含如下代码段:
foo:
表情符号索引:!!python/name:materialx.emoji.twemoji
当我跑步时:
以open(“test.yml”,“r”)作为流:
尝试:
打印(yaml.安全加载(流))
除作为exc的yaml.YAMLError外:
打印(exc)
这会引发以下错误:
could not determine a constructor for the tag 'tag:yaml.org,2002:python/name:materialx.emoji.twemoji'
in "test.yml", line 2, column 18
安全加载
限制加载程序只加载它知道的类型。这是因为加载任意类型可能导致执行任意代码,这是一种安全风险
要正确加载文件,您有以下选项:
- 使用
而不是load
导入包含safe\u load
的库(我不确定这是在哪里定义的,我在网上没有找到明确的答案)materialx.emoji.twemoji
- 不要将YAML文件加载到本机类型,而是使用
将其加载到节点图中。这将返回YAML文档的根节点。这不会将节点直接放入YAML.compose
s、dict
s等list
- 注册自己的构造函数:
def my_构造函数(加载器、节点):
#由于节点的内容为空,因此应该返回一个
#可用于标识节点,例如。
返回“materialx.emoji.twemoji”
add_构造函数('tag:yaml.org,2002:python/name:materialx.emoji.twemoji',
我的_构造函数,yaml.SafeLoader)
哪种方法是最好的取决于您想对数据做什么