2012-04-03 7 views
1

Ich habe einen Prozess, der ein Wörterbuch mit Python 3.2 in Essig einlegt. Ich muss dann dieses Wörterbuch mit Python 2.7 oder 2.6 entpacken. Das Problem ist, dass ich beim Übertragen zwischen Python-Versionen ein Wörterbuch voller Unicode-Daten bekomme, das die Python-API stört, in die ich es einspeisen möchte.Python-Gurke konvertiert zwischen Versionen in Unicode

Abbeizen in Python 3.2:

myDict = {'a': 'first', 'b': 'second', 'c': 'third'} 
with open(file, 'wb') as f: 
    pickle.dump(myDict, f, 2) 

Unpickling in Python 2.6:

with open(file, f) as f: 
    myDict = pickle.load(f) 

Rückkehr: {u'a ': u'first', U'c ': u'third' , u'b ': u'second'}

Wie kann ich genau das zurückbekommen, was ich eingegeben habe (dh nicht Unicode)?

Antwort

6

Sie sind eigentlich genau das, was Sie in, str ‚s Um

in Python 3 are unicode seit Strings setzen immer wieder, können Sie die Schlüssel und Werte im Wörterbuch konvertieren:

strDict = dict((k.encode(), v.encode()) for k, v in myDict.iteritems()) 
+0

Ah! mein Missverständnis. Ich hatte nicht bemerkt, dass alle Zeichenfolgen in 3.x Unicode waren. Laut der Dokumentation vor Version 3 sollte Protokoll = 0 ein ASCII-Format sein, aber Sie können dies nicht verwenden, um die Ausgabe nach ASCII zu erzwingen, weil etwas geändert wurde und die Dokumentation für v3 von 'ASCII' in 'subtil' geändert wird "menschlich lesbar" (seufz). Ihre Lösung ist jedoch schnell und schmerzlos. Vielen Dank – MappaGnosis

0

Als steef Beachten Sie, dass Sie genau das zurückbekommen, was Sie eingegeben haben, da in Python 3 eine Unicode-Zeichenfolge ist und (in beiden Versionen) b'foo' eine Bytezeichenfolge ist.

Die Lösung nach dem Entpacken ist encode Ihre Zeichenfolgen zu einer Byte-Darstellung.

Eine Alternative wäre, Ihre Daten einfach als yaml in beliebiger Kodierung zu serialisieren.

Verwandte Themen