¿Cómo cargar un archivo pickle que contiene un diccionario con caracteres Unicode?

Tengo un diccionario:

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

Lo he escrito en un archivo de salmuera:

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

Si bash cargarlo:

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

Me sale un error:

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

¿Alguna idea de como resolver esto? La ayuda es muy apreciada.

pickle es un formato binario, usar códec traducciones antes de escribir lo romperá. Intente simplemente escribir en un archivo y volver a cargarlo:

 >>> 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} 

Pero lo más probable es que quieras usar Unicode en primer lugar:

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

Creo que el problema es el uso de codecs.open . Los encurtidos son binarios, no texto, y el codec es para la conversión transparente de una encoding de texto a Unicode. Deberías usar open lugar.

Cuestión anterior, pero … Tuve el mismo problema y no pensé que una IO extra en el disco fuera una buena solución. Le sugiero que utilice la encoding / deencoding base64.

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

Incluso cPickle podría usarse de la misma manera para obtener resultados más rápidos en lotes.