【问题标题】:How to solve the error which occurs when using from pickle.load() function?如何解决使用 from pickle.load() 函数时出现的错误?
【发布时间】:2016-01-20 19:30:53
【问题描述】:

我想在 IPython 环境中加载数据集并使用它。

在包含数据集的目录中,我有这些文件:

  • batches.meta
  • data_batch_1
  • data_batch_2
  • data_batch_3
  • data_batch_4
  • data_batch_5
  • 自述文件
  • test_batch

我写了这段代码:

import os
import pickle as pickle
import numpy as np
import matplotlib.pyplot as plt

#Function Definition
def load_CIFAR(ROOT):
xs=[];
ys=[];
for b in range(6):
    f = os.path.join(ROOT, "data_batch_%d"%(b+1));
    X, Y = load_CIFAR_batch(f);
    xs.append(X);
    ys.append(Y);
Xtr = np.concatenate(xs);
Ytr = np.concatenate(ys);

del X, Y;
Xte, Yte = load_CIFAR_batch(os.path.join(ROOT, "test_batch"));
return Xtr, Ytr, Xte, Yte

#Function Definition
def load_CIFAR_batch(filename):
with open(filename, 'r') as f:

    ****** Here is where  error occurs
    datadict = pickle.load(f);
    ******
    X = datadict['data'];
    Y = datadict['labels'];
    X = X.reshape(10000, 3, 32, 32).transpose(0,2,3,1).astype("float");
    Y = np.array(Y);
    return X, Y;

但是,当我使用此函数通过以下命令加载此数据集时,我遇到了 [a bytes-like object is required, not 'str'] 错误。

#The directory of my dataset in my hard drive
url = 'D:\\OTIWU\\data\\cifar10'
Xtr, Ytr, Xte, Yte = load_CIFAR(url) 

上面是我用过的一个命令。

The whole error:
---------------------------------------------------------------------------
TypeError  Traceback (most recent call last)
<ipython-input-14-f0576df4fbda> in <module>()
----> 1 Xtr, Ytr, Xte, Yte = load_CIFAR(url)

<ipython-input-10-fedf6bd7c144> in load_CIFAR(ROOT)
      4     for b in range(1,6):
      5         f=os.path.join(ROOT, "data_batch_%d" % (b, ));
      ----> 6         X, Y=load_CIFAR_batch(f);
      7         xs.append(X);
      8         ys.append(Y);

      <ipython-input-13-368cd3e9d8d2> in load_CIFAR_batch(filename)
      1 def load_CIFAR_batch(filename):
      2     with open(filename, 'r') as f:
      ----> 3         datadict = pickle.load(f);
      4 
      5         X = datadict['data'];

      TypeError: a bytes-like object is required, not 'str'

我该如何解决这样的问题?

【问题讨论】:

  • 你在哪里pickling 数据?看来您需要使用pickle.loads(...) 而不是pickle.load(...)
  • 向我们展示pickle文件是如何创建的。
  • @JohnGordon 对不起,我必须编辑问题的上下文?
  • 编辑您的帖子以包含创建泡菜文件的代码。
  • 您是否尝试过使用 open(, 'rb') 以二进制模式读取?只是一个想法,这可能是原因

标签: python python-3.x pickle


【解决方案1】:

我找到了解决方案。这是一个与 python 3.x 相关的问题。当我用 python 2.x 运行它时,我可以从数据集中读取所有数据。我还不得不说我对源代码做了一点改动。我的意思是我使用了 cPickle 库而不是 Pickle,除了这个问题之外的所有源代码都和以前一样。

【讨论】:

    【解决方案2】:

    您需要以二进制模式打开文件

    with open(filename, 'rb') as f:
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-23
      • 2019-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多