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()のencodinglatin1を指定すると上手くいく。

    def unpickle(self, f):
        fo = open(f, 'rb')
        d = cPickle.load(fo, encoding='latin1')
        fo.close()

        return d

参考文献