如何加载包含unicode字符的字典的pickle文件?

问题描述:

我有一本字典:如何加载包含unicode字符的字典的pickle文件?

mydict={'öö':1,'ää':2} 

我把它写入泡菜文件:

a=codecs.open(r'mydict.pkl', 'wb', 'utf-8') 
pickle.dump(mydict, a) 

如果我尝试加载它:

m=codecs.open(r'mydict.pkl', 'rb', 'utf-8') 
mydict = pickle.load(m) 

我得到一个错误:

KeyError: u"S'\\xe4\\xe4'\np1\nI2\nsS'\\xf6\\xf6'\np2\nI1\ns." 

任何想法如何解决这个问题?帮助是非常appriciated。

pickle是一种二进制格式,在写入之前使用编解码器翻译将会破坏它。尝试只写入一个文件并加载回:

>>> mydict={'öö':1,'ää':2} 
>>> mydict 
{'\xc3\xb6\xc3\xb6': 1, '\xc3\xa4\xc3\xa4': 2} 
>>> pickle.dump(mydict, open('/tmp/test.pkl', 'wb')) 
>>> pickle.load(open('/tmp/test.pkl', 'rb')) 
{'\xc3\xb6\xc3\xb6': 1, '\xc3\xa4\xc3\xa4': 2} 

但最有可能你要在第一时间使用Unicode:

>>> mydict={u'öö':1,u'ää':2} 

我相信问题是使用codecs.open。泡菜是不是文本的二进制文件,codec是用于从一些文本编码到unicode的透明转换。您应该只使用open

老问题,但...我有同样的问题,我不认为额外的磁盘IO是一个很好的解决方案。我建议你使用base64编码/解码。

import base64 

serialized_str = base64.b64encode(pickle.dumps(mydict)) 
my_obj_back = pickle.loads(base64.b64decode(serialized_str)) 

即使使用cPickle也可以以相同的方式在批处理中获得更快的结果。