python3中使用pickle加载cPickle产生的文件

Python3中将cPickle改成了pickle.

当在Python3中尝试使用pickle导入cPickle产生的文件:

import pickle
import gzip
import numpy


with gzip.open('mnist.pkl.gz', 'rb') as f:
    l = list(pickle.load(f))
    print(l)

可能会产生以下错误:

Traceback (most recent call last):
   File "mnist.py", line 7, in <module>
     train_set, valid_set, test_set = pickle.load(f)
UnicodeDecodeError: 'ascii' codec can't decode byte 0x90 in position 614: ordinal not in range(128)

解决方案如下:

方法1:

import pickle
import gzip
import numpy

with open('mnist.pkl', 'rb') as f:
    u = pickle._Unpickler(f)
    u.encoding = 'latin1'
    p = u.load()
    print(p)

方法2:

pickle.load(file, encoding='latin1')

其实这个Bug引入的原因,还是Python3和Python2之间的编码问题导致的。

参考链接:

1.Pickle incompatibility of numpy arrays between Python 2 and 3

    原文作者:江峰
    原文地址: https://zhuanlan.zhihu.com/p/34256200
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞