2015-11-22 16 views
5

を含むCIFAR-10 datasetで作業しようとしています。シリアル化されたデータをpython2で読み取る方法cPikle with python3 pickle?

バイナリファイルのセットであり、それぞれが10k個のnumpy行列の辞書を表します。ファイルはpython2 cPickleによって明らかに作成されました。これは本当に素晴らしい作品

​​

は、私は次のようにpython2からそれをロードしようとしました。私は(それが代わりにない cPickleが、 pickleを持っている)のpython3からデータをロードしようとした場合しかし、それは失敗します。

import pickle 
with open("data/data_batch_1", "rb") as f: 
    data = pickle.load(f) 

次のエラーで失敗した場合:

UnicodeDecodeError: 'ascii' codec can't decode byte 0x8b in position 6: ordinal not in range(128) 

私は何とか変換することができますpython3から読み込み可能な新しいデータセットへのオリジナルデータセット?それとも、私は何とかpython3 direrctlyからそれを読むことができますか?

私は、cPickleことによってそれをロードjsonにそれをダンプし、pickleで戻ってそれを読んで試してみたが、numpyの行列が明らかにJSONファイルとして書き込むことができません。

答えて

5

あなたはそれらのバイト文字列のために何のコーデックを使用するようにピクルスを伝える必要があり、またはその代わりbytesとしてデータをロードするためにそれを教えてあげましょう。 pickle.load() documentationから:

The encoding and errors tell pickle how to decode 8-bit string instances pickled by Python 2; these default to ‘ASCII’ and ‘strict’, respectively. The encoding can be ‘bytes’ to read these 8-bit string instances as bytes objects.

だろうbytesオブジェクトのように文字列をロードするには、次のメッセージ `TypeError例外を取得した後、この修正プログラムを適用した場合:ちょうどグーグル経由でこれを見つける他人のため

import pickle 
with open("data/data_batch_1", "rb") as f: 
    data = pickle.load(f, encoding='bytes') 
+1

を:あなたのnumpyバージョンは古すぎ、[this](https://github.com/numpy/numpy/issues/4879)のバグを持っています。 –

+0

latin1を使用し、バイトを使わない方が良いかもしれません。 –

+0

@ShimonDoodkin:データに完全に依存します。そしてLatin-1が常に機能するということは、あなたが実際にLatin-1データを持っていたという意味ではありません。 –

関連する問題