yaml读取写入常见错误 (‘cannot represent an object‘, 117)
错误一:yaml.representer.RepresenterError: (‘cannot represent an object’, 117)
出现这个问题一直没找到原因,后面把yaml.safe_dump直接替换成yaml.dump,确实能保存,但出现乱码:
放弃yaml.dump,又切回yaml.safe_dump。后面发现它只支持基本的数据类型,对于自定义对象或某些复杂对象(如 NumPy 数组、自定义类实例等),不知道如何序列化。
检查序列,确实存在数组:
改成int或list即可,具体可以参考下面的代码:
# 对象定义自定义的表示器(representer),序列化自定义对象####################
# numpy类型
import yaml
import numpy as npdef numpy_representer(dumper, data):return dumper.represent_list(data.tolist())yaml.add_representer(np.ndarray, numpy_representer)
data = {'array': np.array([1, 2, 3])}
with open('output.yaml', 'w') as f:yaml.dump(data, f)####################
# class类型
import yaml
class MyClass:def __init__(self, value):self.value = valuedef myclass_representer(dumper, data):return dumper.represent_scalar('tag:yaml.org,2002:str', str(data.value))yaml.add_representer(MyClass, myclass_representer)
data = {"my_object": MyClass(117),"other_data": [1, 2, 3]}
with open('output.yaml', 'w') as f:yaml.dump(data, f)
错误二:yaml.composer.ComposerError: expected a single document in the stream
在用yaml.dump写入**.yaml文件时,会用 “—**” 做分隔,如下所示:
# 文档1
key1: value1
---
# 文档2
key2: value2
直接用yaml.load读取会报错:
是因为PyYAML 库,默认情况下 yaml.safe_load() 或 yaml.load() 只会加载第一个文档。
需要加载所有文档,可以使用 yaml.safe_load_all() 或 yaml.load_all()。
import yaml# 对于单个文档
with open('file.yaml', 'r') as f:data = yaml.safe_load(f) # 只加载第一个文档# 对于多个文档
with open('file.yaml', 'r') as f:documents = list(yaml.safe_load_all(f)) # 加载所有文档chain_map = ChainMap(*documents)merged_dict = dict(chain_map)