2012-03-19 8 views
8

私は辞書を持っている:辞書を含むピクルファイルをユニコード文字でロードするにはどうすればいいですか?

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

私はピクルスファイルに書かれている:私はそれをロードしようとした場合

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

これを解決する方法はありますか?ヘルプは大きく訴求されています。

答えて

8

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

私はこの問題がcodecs.openの使用であると信じています。ピクルスはテキストではないバイナリであり、codecはテキストエンコーディングからユニコードへの透過的な変換用です。代わりにopenを使用してください。

0

古い問題けど...私は同じことを持っていました問題と私は余分なディスクIOが良い解決策だとは思わなかった。私はbase64エンコード/デコードを使用することをお勧めします。

import base64 

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

cPickleでさえも、バッチ処理の高速化のために同じ方法で使用できます。

関連する問題