pyyaml safe_load:如何忽略本地标签

Posted

技术标签:

【中文标题】pyyaml safe_load:如何忽略本地标签【英文标题】:pyyaml safe_load: how to ignore local tags 【发布时间】:2016-01-08 00:12:42 【问题描述】:

我正在使用yaml.safe_load(),但我需要忽略标签!v2——有没有办法做到这一点但仍然使用safe_load()

【问题讨论】:

【参考方案1】:

我想通了,和How can I add a python tuple to a YAML file using pyYAML?有关

我只需要这样做:

子类yaml.SafeLoader 调用add_constructor!v2 分配给自定义构造方法 在自定义构造方法中,做任何适当的事情 使用yaml.load(..., MyLoaderClass) 而不是yaml.safe_load(...)

它有效。

class V2Loader(yaml.SafeLoader):
    def let_v2_through(self, node):
        return self.construct_mapping(node)
V2Loader.add_constructor(
    u'!v2',
    V2Loader.let_v2_through)

   ....

y = yaml.load(info, Loader=V2Loader)

【讨论】:

如果您只想跳过/忽略任何标签,另请参阅***.com/a/13281292/165629。【参考方案2】:

扩展现有答案以支持忽略所有未知标签。

import yaml

class SafeLoaderIgnoreUnknown(yaml.SafeLoader):
    def ignore_unknown(self, node):
        return None 

SafeLoaderIgnoreUnknown.add_constructor(None, SafeLoaderIgnoreUnknown.ignore_unknown)

root = yaml.load(content, Loader=SafeLoaderIgnoreUnknown)

【讨论】:

【参考方案3】:

this solution 的问题在于它只适用于v2 标签,并且只有当它所在的 yaml 对象是映射类型对象时。

This solution 将适用于所有标签,但问题是数据将被完全忽略。你只会得到一个null 的数据。

如果您想忽略对所有标签的任何特殊处理,但仍然得到解析的值,就好像标签不存在一样,以下应该有效:

def unknown(loader, suffix, node):
    if isinstance(node, yaml.ScalarNode):
        constructor = loader.__class__.construct_scalar
    elif isinstance(node, yaml.SequenceNode):
        constructor = loader.__class__.construct_sequence
    elif isinstance(node, yaml.MappingNode):
        constructor = loader.__class__.construct_mapping

    data = constructor(loader, node)

    return data

yaml.add_multi_constructor('!', unknown)
yaml.add_multi_constructor('tag:', unknown)

return yaml.load_all(infile, Loader=yaml.FullLoader)

请注意,如果您想使用不同的加载器,例如 SafeLoader,您需要在调用加载函数之前将该加载器显式提供给 add_multi_constructor():

yaml.add_multi_constructor('!', unknown, Loader=yaml.SafeLoader)

...

return yaml.load_all(infile, Loader=yaml.SafeLoader)

【讨论】:

以上是关于pyyaml safe_load:如何忽略本地标签的主要内容,如果未能解决你的问题,请参考以下文章

实用的 PyYAML 使用技巧

了解 YAML 文件与数据配置

PyYAML 和不寻常的标签

pyyaml:不带标签的倾销

Python的PyYAML模块详解

mypy 如何忽略源文件中的一行?