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

时间:2012-03-19 16:18:57

标签: python unicode dictionary pickle

我有一本字典:

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

我把它写到了一个pickle文件中:

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."

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

3 个答案:

答案 0 :(得分:8)

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}

答案 1 :(得分:3)

我认为问题在于使用codecs.open。 Pickles是二进制文件而不是文本,codec用于从某些文本编码到unicode的透明转换。您应该只使用open

答案 2 :(得分:0)

旧问题但是...我遇到了同样的问题,我没想到额外的磁盘IO是一个很好的解决方案。我建议你使用base64编码/解码。

import base64

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

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