【问题标题】:TypeError: can't pickle generator objectsTypeError:无法腌制生成器对象
【发布时间】:2015-05-11 20:51:53
【问题描述】:

我正在尝试将一些结果写入泡菜文件,如下所示:

raw_X = (self.token_ques(text) for text in training_data)
with open('/root/Desktop/classifier_result.pkl', 'wb') as handle:
    pickle.dump(raw_X, handle)

错误:

    raise TypeError, "can't pickle %s objects" % base.__name__
TypeError: can't pickle generator objects

任何帮助都会非常感激。

【问题讨论】:

标签: python generator pickle


【解决方案1】:

当您想要腌制数据时,不要使用生成器表达式。请改用列表推导式,或在生成器上调用 list() 以捕获所有生成的元素以进行酸洗。

例如,以下工作就可以了:

raw_X = [self.token_ques(text) for text in training_data]
with open('/root/Desktop/classifier_result.pkl', 'wb') as handle:
    pickle.dump(raw_X, handle)

就像这样:

raw_X = (self.token_ques(text) for text in training_data)
with open('/root/Desktop/classifier_result.pkl', 'wb') as handle:
    pickle.dump(list(raw_X), handle)

【讨论】:

  • @nlper:那么self.token_ques(text) 会返回什么?那可能也是一个生成器对象吗?
  • 是的,当我打印类型时它给出了<type 'generator'>
  • 所以将list()应用于每个返回值; raw_X = [list(self.token_ques(text)) for text in training_data]
  • 好的,但是当我加载回来时,我怎样才能把它变成原来的形式
  • 定义原始表单。您仍然可以遍历未腌制的列表;它们是可迭代的,就像生成器产生可迭代一样。
【解决方案2】:
raw_X = (self.token_ques(text) for text in training_data)

这是一个发电机。正如错误所说,我们不能腌制生成器。改用这个。

raw_X=[]
for text in data:
  raw_X.append(self.token_ques(text))
raw_X=tuple(raw_X)

然后腌制raw_X


编辑

这对我有用

import pickle

raw_X=[]
data=[1,2,3,4,5,6,2,0]
for text in data:
    raw_X.append(str(text))

print pickle.dumps(raw_X)

我使用str() 代替您的函数,使用dumps() 代替dump()

【讨论】:

  • 为什么要把它变成一个元组?如果一个元组是目标,只需使用tuple(self.token_ques(text) for text in training_data)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-23
  • 2019-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多