web-dev-qa-db-fra.com

TypeError: impossible de décaper des objets de générateur

J'essaie d'écrire un résultat sur le fichier de cornichon comme ci-dessous:

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)

Erreur:

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

Toute aide serait très appréciable.

13
nlper

N'utilisez pas d'expression de générateur lorsque vous souhaitez décaper des données. Utilisez plutôt une compréhension de liste ou appelez list() sur le générateur pour capturer tous les éléments générés pour le décapage.

Par exemple, ce qui suit fonctionne très bien:

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)

de même que:

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)
5
Martijn Pieters
raw_X = (self.token_ques(text) for text in training_data)

Ceci est un générateur. Comme le dit l'erreur, nous ne pouvons pas mariner les générateurs. Utilisez-le à la place.

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

Et marinez raw_X Alors.


Modifier

Ça marche pour moi

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)

J'utilise str() au lieu de votre fonction et dumps() au lieu de dump().

4
ForceBru