Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 分析带有感叹号的yaml时出错_Python_Yaml_Pyyaml_Mkdocs - Fatal编程技术网

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.compose
    将其加载到节点图中。这将返回YAML文档的根节点。这不会将节点直接放入
    dict
    s、
    list
    s等
  • 注册自己的构造函数:
def my_构造函数(加载器、节点):
#由于节点的内容为空,因此应该返回一个
#可用于标识节点,例如。
返回“materialx.emoji.twemoji”
add_构造函数('tag:yaml.org,2002:python/name:materialx.emoji.twemoji',
我的_构造函数,yaml.SafeLoader)
哪种方法是最好的取决于您想对数据做什么