TypeError:不能腌制生成器对象

时间:2015-03-10 12:09:50

标签: 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__
TypeError: can't pickle generator objects

任何帮助都会非常明显。

2 个答案:

答案 0 :(得分:5)

当你想要腌制数据时,不要使用生成器表达式。改为使用列表推导,或者在生成器上调用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)

答案 1 :(得分:4)

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