Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何加载包含unicode字符字典的pickle文件?_Python_Unicode_Dictionary_Pickle - Fatal编程技术网

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

Python 如何加载包含unicode字符字典的pickle文件?,python,unicode,dictionary,pickle,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\\x

我有一本字典:

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

有什么办法解决这个问题吗?非常感谢您的帮助。

我认为问题在于使用
编解码器。打开
。pickle是二进制文件而不是文本,
codec
用于从某些文本编码到unicode的透明转换。你应该只使用
open

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}

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

import base64

serialized_str = base64.b64encode(pickle.dumps(mydict))
my_obj_back = pickle.loads(base64.b64decode(serialized_str))
即使是cPickle也可以以同样的方式成批获得更快的结果