pyYAML错误"!" 在一个字符串中

Rok*_*ady 12 python yaml pyyaml

首先,免责声明:我对YAML不太熟悉.我正在尝试将YAML文档解析为关键值对(不要担心我是如何做的.我已经处理好了这一点)

我的文件过去看起来像:

world:
     people:
          name:Suzy
          address:chez-bob
Run Code Online (Sandbox Code Playgroud)

然后,有人去改变它.

world:
     people:
          name:!$uzy
          address:chez-bob
Run Code Online (Sandbox Code Playgroud)

我得到这个解析错误:

yaml.constructor.ConstructorError: could not determine a constructor for the tag '!$uzy'
Run Code Online (Sandbox Code Playgroud)

这甚至意味着什么?我怎么会去解释它!$只有两个字符?我只想要一个字符串键和值的字典!此外,编辑yaml文件不是一个选项.必须使用解析器在代码中修复问题.

kic*_*hik 14

感叹号是YAML标记的前缀.解析器必须通过标记名称为它实现构造函数.有一些默认标签,如!!bool,!!int等,甚至一些Python特定的标签,如!!python/tuple.

您可以为前缀捕获的多个标记定义自己的构造函数甚至构造函数.通过定义前缀'',您可以捕获所有标记并忽略它们.您可以从构造函数返回标记及其值,只需将其作为文本处理.

>>> import yaml
>>> def default_ctor(loader, tag_suffix, node):
...     print loader
...     print tag_suffix
...     print node
...     return tag_suffix + ' ' + node.value
...
>>> yaml.add_multi_constructor('', default_ctor)
>>> yaml.load(y)
<yaml.loader.Loader object at 0xb76ce8ec>
!$uzy
ScalarNode(tag=u'!$uzy', value=u'')
{'world': {'people': {'name': '!$uzy', 'address': 'chez-bob'}}}
>>>
Run Code Online (Sandbox Code Playgroud)


小智 6

如果值以"!"开头,则必须将值括在单引号或双引号中; 否则它被解释为YAML标记.

world:
     people:
          name: "!$uzy"
          address: chez-bob
Run Code Online (Sandbox Code Playgroud)