Estoy tratando de escribir algunos de los resultados en archivo pickle de la siguiente manera:

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 Error:

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

Cualquier ayuda sería muy apreciable.

por qué downvote aquí?
Este es un viejo problema: bugs.python.org/issue1092962, sin embargo stackless python ha resuelto: gossamer-threads.com/lists/python/python/198963. es es posible, pero tienes que trabajar en python en la C/C++ nivel.
Curiosamente, las razones que se dan aquí: peadrop.com/blog/2009/12/29/why-you-cannot-pickle-generators son manejados por stackless… y también para la mayor parte por dill.

OriginalEl autor nlper | 2015-03-10

2 Comentarios

  1. 5

    No utilizar un generador de expresión cuando desee pickle de datos. El uso de una lista de comprensión en su lugar, o llame list() en el generador para capturar todos los elementos generados para el decapado.

    Por ejemplo, la siguiente funciona 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)

    como:

    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)
    sigue el mismo error
    entonces, ¿qué hace self.token_ques(text) retorno? Es que un generador de objetos demasiado tal vez?
    sí, cuando me imprime el tipo se dio <type 'generator'>
    Para aplicar list() para cada valor de retorno; raw_X = [list(self.token_ques(text)) for text in training_data]
    Definir original de formulario. Todavía se puede iterar sobre el unpickled listas; son iterables igual que los generadores producen iterables.

    OriginalEl autor Martijn Pieters

  2. 4
    raw_X = (self.token_ques(text) for text in training_data)

    Este es un generador. Como el error dice, no podemos pickle generadores. El uso de este lugar.

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

    Y pepinillos raw_X entonces.


    Editar

    Esto funciona para mí

    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)

    Estoy usando str() en lugar de su función y dumps() en lugar de dump().

    Por qué convertirlo en una tupla? Si una tupla era el objetivo, sólo tiene que utilizar tuple(self.token_ques(text) for text in training_data).
    sigue el mismo error
    por favor vea mis editado respuesta

    OriginalEl autor ForceBru

Dejar respuesta

Please enter your comment!
Please enter your name here