问题
用yaml.safe_dump把一个OrderedDict类型的数据写入yaml时,遇到报错yaml.representer.RepresenterError
原因
默认的序列化器不支持OrderedDict类型,需要注册自定义的处理方法
解决办法
- 自定义类
from collections import OrderedDict
import yaml
def ordered_yaml_dump(data, stream, Dumper=yaml.SafeDumper):
class OrderedSafeDumper(Dumper):
pass
def _represent_ordereddict(dumper, data):
return dumper.represent_dict(data.items())
OrderedSafeDumper.add_representer(OrderedDict, _represent_ordereddict)
yaml.dump(data, stream, Dumper=OrderedSafeDumper, indent=2, encoding='utf-8', allow_unicode=True, default_flow_style=False, sort_keys=False)
# 使用
ordered_yaml_dump(myOrderedDictData, myFileStream)
- 改造SafeDumper
from collections import OrderedDict
import yaml
def ordered_dict_representer(dumper, data):
return dumper.represent_dict(data.items())
yaml.SafeDumper.add_representer(OrderedDict, ordered_dict_representer)
# 使用
yaml.safe_dump(myOrderedDictData, myFileStream, indent=2, encoding='utf-8', allow_unicode=True, default_flow_style=False, sort_keys=False)