2012-03-19 20 views
8

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

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 trato de cargarlo:

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

Me aparece un error:

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

¿Alguna idea de cómo resolver esto? La ayuda es muy apreciada.

Respuesta

8

pickle es un formato binario, utilizando las traducciones de códec antes de que la escritura lo rompa. Tratar de simplemente escribir en un archivo y cargar de nuevo:

>>> 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 que desee utilizar Unicode en el primer lugar:

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

Creo que el problema es el uso de codecs.open. Las salmueras son binarias, no texto, y codec es para la conversión transparente de algunas codificaciones de texto a Unicode. Deberías simplemente usar open en su lugar.

0

tema antiguo, pero ... he tenido la misma problema y no pensé que IO de disco adicional fuera una buena solución. Te sugiero que uses codificación/decodificación base64.

import base64 

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

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

Cuestiones relacionadas