2012-04-03 15 views
1

私はPython 3.2を使用して辞書を漬けるプロセスを持っています。 Python 2.7または2.6を使用してこの辞書をunpickleする必要があります。問題は、Pythonのバージョン間で転送するときに私はそれをフィードしようとしているPythonのAPIを混乱させるユニコードのデータでいっぱいの辞書を取得することです。 Pythonの3.2Python pickleはバージョン間でユニコードに変換されます

酸洗:Pythonの2.6で

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

unpickle化:

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

戻り値:{u'a ':u'first'、u'c ':u'third' 、u'b ':u'second'}

私が入れたもの(つまり、ユニコードではないもの)をどのように戻すことができますか?

答えて

6

Python 3 are unicode

内の文字列がstr年代を取得するにはので、あなたが実際に、あなたが入れまさにバック取得している、あなたは辞書にキーと値を変換することができます:steefとして

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

Ah!私の誤解。私は3.xのすべての文字列がUnicodeであることに気づいていませんでした。 pre v3のドキュメントによると、protocol = 0はASCII形式になっていますが、何かが変更され、v3のドキュメントが 'ASCII'から ' 「人間が読める」(しばらく)。あなたの解決策は迅速かつ痛みはありません。ありがとう – MappaGnosis

0

あなたが入れたものを正確に返すようになりました.3 'foo'はUnicode文字列です(どちらのバージョンでも)b'foo'はバイト文字列です。

解凍後の解は、encode文字列をバイト表現に変換します。

代わりに、好きなエンコーディングで、たとえばyamlのようにデータをシリアライズするだけです。

関連する問題