【问题标题】:How to read serialized data by python2 cPikle with python3 pickle?如何通过 python2 cPikle 和 python3 pickle 读取序列化数据?
【发布时间】:2015-11-22 15:08:39
【问题描述】:

我正在尝试使用包含a special version for pythonCIFAR-10 dataset

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

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

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

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

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 中读取它吗?

我试过用cPickle加载它,把它转储到json,然后用pickle读回来,但是numpy矩阵显然不能写成json文件。

【问题讨论】:

    标签: python python-2.7 python-3.x serialization pickle


    【解决方案1】:

    您需要告诉pickle 为这些字节串使用什么编解码器,或者告诉它以bytes 加载数据。来自pickle.load() documentation

    encodingerrors 告诉 pickle 如何解码 Python 2 腌制的 8 位字符串实例;这些默认分别为“ASCII”和“严格”。 encoding 可以是“bytes”,将这些 8 位字符串实例读取为字节对象。

    将字符串加载为bytes 对象:

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

    【讨论】:

    • 仅适用于通过 google 找到此内容的其他人:如果您应用此修复程序,则收到消息 TypeError: must be a unicode character, not bytes,您的 numpy 版本太旧并且有 this 错误。
    • 最好使用 latin1 而不是字节
    • @ShimonDoodkin:这完全取决于数据。仅仅因为 Latin-1 始终有效并不意味着您实际上拥有 Latin-1 数据。
    猜你喜欢
    • 2019-09-05
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    • 2015-06-13
    • 2016-07-14
    • 1970-01-01
    相关资源
    最近更新 更多