Python 类型错误:can';t pickle生成器对象

Python 类型错误:can';t pickle生成器对象,python,generator,pickle,Python,Generator,Pickle,我正在尝试将一些结果写入pickle文件,如下所示: 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__

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

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

任何帮助都会非常可观。

当您想要pickle数据时,不要使用生成器表达式。改为使用列表理解,或在生成器上调用
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)
这是一台发电机。正如错误所说,我们无法对生成器进行pickle处理。用这个代替

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()

@nlper:那么
self.token\u ques(text)
返回什么呢?这也可能是生成器对象吗?是的,当我打印类型时,它给出了
,所以对每个返回值应用
list()
raw\u X=[list(self.token\u ques(text))用于训练数据中的文本]
好的,但是当我加载回它时,我如何将它放在原始格式中定义原始格式。您仍然可以遍历未勾选的列表;它们是iterables,就像生成器生成的iterables一样。为什么要将其转换为元组?如果目标是一个元组,只需使用
元组(self.token\u ques(text)表示训练数据中的文本)
。这是一个老问题:,但是stackless python解决了它:。这是可能的,但您必须在C/C++级别使用python。有趣的是,这里给出的理由是:由
stackless
…处理,并且在大多数情况下也是由
dill
处理的。
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)