pyyaml safe_load:如何忽略本地标签

时间:2015-10-09 23:27:44

标签: python yaml pyyaml

我正在使用yaml.safe_load(),但我需要忽略标记!v2 - 是否有办法执行此操作但仍然使用safe_load()

3 个答案:

答案 0 :(得分:2)

我弄清楚了,它与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)

答案 1 :(得分:0)

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

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)

答案 2 :(得分:0)

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)