Python3でcPickleのエラーを回避する
CIFAR-10を読み込もうとしたら、Python2で動いてたcPickleがPython3では動かない。
import cPickle
と書けばImportError: No module named 'cPickle'
と吐き、
d = cPickle.load(f)
と書けばUnicodeDecodeError: 'ascii' codec can't decode byte 0x8b in position 6: ordinal not in range(128)
と吐く。
これらの問題を解決する。
cPicleではなく、_pickleを使う
Python3ではcPicle
など存在しない。代わりに_pickle
を使えばいいのだが、
修正を最小限にするために、以下のように記述する。
#import cPickle import _pickle as cPickle
loadできない場合はエンコードを指定する
load()のencoding
にlatin1
を指定すると上手くいく。
def unpickle(self, f): fo = open(f, 'rb') d = cPickle.load(fo, encoding='latin1') fo.close() return d