我正在使用yaml.safe_load()
,但我需要忽略标记!v2
- 是否有办法执行此操作但仍然使用safe_load()
?
答案 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)