我有一个巨大的YAML文件,其中包含此代码段中的标记定义
- !!python/object:manufacturer.Manufacturer
name: aaaa
address: !!python/object:address.BusinessAddress {street: bbbb, number: 123, city: cccc}
我需要加载它,首先要确保文件是正确的YAML,其次是在给定某个上下文的某个树上提取信息。我将这一切都作为嵌套的dicts,列表和原语来完成。但我无法加载文件,因为我没有原始的Python源和类定义,所以yaml.load()
已经出来了。
我尝试了yaml.safe_load()
但是抛出和异常。
BaseLoader加载文件,因此它是正确的。但是这会把所有原始信息(数字,日期时间)混为一体。
然后我找到了How to deserialize an object with PyYAML using safe_load?,因为文件中定义了100多个不同的标签,所以提供的解决方案是不切实际的。
我是否必须使用其他一些工具去除!!标签定义(至少有一次!!
出现在普通字符串中),所以我可以使用safe_load。是否有更简单的方法来解决这个我不知道的事情?
如果没有,我将不得不做一些字符串解析来恢复类型,但我想我先问这里。
答案 0 :(得分:1)
如果你想在这样的文件上使用safe_loader()
,就没有必要去添加任何类的繁琐路线。
ConstructorError
SafeConstructor.construct_undefined()
constructor.py
中应该constructor.py
投放import yaml
from yaml.constructor import SafeConstructor
def my_construct_undefined(self, node):
data = {}
yield data
value = self.construct_mapping(node)
data.update(value)
SafeConstructor.add_constructor(
None, my_construct_undefined)
yaml_str = """\
- !!python/object:manufacturer.Manufacturer
name: aaaa
address: !!python/object:address.BusinessAddress {street: bbbb, number: 123, city: cccc}
"""
data = yaml.safe_load(yaml_str)
print(data)
。通过[{'name': 'aaaa', 'address': {'city': 'cccc', 'street': 'bbbb', 'number': 123}}]
文件中的“无”案例,该方法将在秋季注册。
如果将该信息与所有这些标记的“类”都是映射(而不是列表或标量)的事实相结合,您只需在新函数中复制映射的代码并将其注册为直通案例。
static void add(Map<Integer,List<Movie>> map, Movie movie) {
List<Movie> list = map.get(movie.rank);
if (list == null) {
list = new ArrayList<Movie>();
map.put(movie.rank, list);
}
list.add(movie);
}
应该得到你:
$("#symbol_id").find("g").attr('fill', "#colorOfChoice");
没有抛出异常,并且“number”作为整数而不是字符串。