如何通过python3 cpikle和python3 pickle读取序列化数据?

pet*_*bel 5 python serialization pickle python-2.7 python-3.x

我正在尝试使用包含python特殊版本的CIFAR-10数据集.

它是一组二进制文件,每个文件代表10k numpy矩阵的字典.这些文件显然是由python2创建的cPickle.

我试着从python2加载它,如下所示:

import cPickle
with open("data/data_batch_1", "rb") as f:
    data = cPickle.load(f)
Run Code Online (Sandbox Code Playgroud)

这真的很棒.但是,如果我尝试从python3加载数据(没有,cPickle而是pickle替代),它会失败:

import pickle
with open("data/data_batch_1", "rb") as f:
    data = pickle.load(f)
Run Code Online (Sandbox Code Playgroud)

如果失败并出现以下错误:

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

我可以以某种方式将原始数据集转换为可从python3读取的新数据集吗?或者我可能以某种方式从python3直接读取它?

我已经尝试加载它cPickle,将其转储json并读回来pickle,但是numpy矩阵显然不能写成json文件.

Mar*_*ers 5

你需要告诉pickle用于那些字节串的编解码器,或者告诉它加载数据bytes.从pickle.load()文档:

编码错误告诉泡菜如何被Python 2腌8位字符串实例进行解码; 这些默认分别为'ASCII'和'strict'.该编码可以是"字节"作为字节对象读取这些8位串的实例.

要将字符串加载为以下bytes对象:

import pickle
with open("data/data_batch_1", "rb") as f:
    data = pickle.load(f, encoding='bytes')
Run Code Online (Sandbox Code Playgroud)