Buscar..


Sintaxis

  • pickle.dump (objeto, archivo, protocolo) # Para serializar un objeto

  • pickle.load (archivo) # Para des-serializar un objeto

  • pickle.dumps (objeto, protocolo) # Para serializar un objeto a bytes

  • pickle.loads (buffer) # Para eliminar un serial de un objeto de bytes

Parámetros

Parámetro Detalles
objeto El objeto que se va a almacenar.
expediente El archivo abierto que contendrá el objeto.
protocolo El protocolo utilizado para el decapado del objeto (parámetro opcional)
buffer Un objeto de bytes que contiene un objeto serializado.

Observaciones

Tipos pickleable

Los siguientes objetos son desmontables.

  • None , True y False
  • números (de todos los tipos)
  • cuerdas (de todo tipo)
  • tuple s, list s, set s y dict s que solo contienen objetos que se pueden recoger
  • Funciones definidas en el nivel superior de un módulo.
  • funciones integradas
  • Clases que se definen en el nivel superior de un módulo.
    • instancias de dichas clases cuyo __dict__ o el resultado de llamar a __getstate__() es seleccionable (consulte los documentos oficiales para obtener más información).

Basado en la documentación oficial de Python .

pickle y seguridad

El módulo pickle no es seguro . No debe utilizarse cuando se reciben datos serializados de una parte que no es de confianza, como a través de Internet.

Usando Pickle para serializar y deserializar un objeto

El módulo pickle implementa un algoritmo para convertir un objeto Python arbitrario en una serie de bytes. Este proceso también se llama serializar el objeto. El flujo de bytes que representa el objeto se puede transmitir o almacenar, y luego reconstruir para crear un nuevo objeto con las mismas características.

Para el código más simple, usamos las funciones dump() y load() .

Para serializar el objeto.

import pickle

# An arbitrary collection of objects supported by pickle.
data = {
    'a': [1, 2.0, 3, 4+6j],
    'b': ("character string", b"byte string"),
    'c': {None, True, False}
}

with open('data.pickle', 'wb') as f:
    # Pickle the 'data' dictionary using the highest protocol available.
    pickle.dump(data, f, pickle.HIGHEST_PROTOCOL)

Deserializar el objeto.

import pickle

with open('data.pickle', 'rb') as f:
    # The protocol version used is detected automatically, so we do not
    # have to specify it.
    data = pickle.load(f)

Usando objetos de pickle y byte

También es posible serializar y deserializar objetos de byte, utilizando la función de dumps y loads , que son equivalentes a dump y load .

serialized_data = pickle.dumps(data, pickle.HIGHEST_PROTOCOL)
# type(serialized_data) is bytes

deserialized_data = pickle.loads(serialized_data)
# deserialized_data == data

Personalizar datos en escabeche

Algunos datos no pueden ser decapados. Otros datos no deben ser decapados por otras razones.

Lo que será decapado se puede definir en el método __getstate__ . Este método debe devolver algo que sea pickable.

En el lado opuesto está __setstate__ : recibirá lo que __getstate__ creó y tiene que inicializar el objeto.

class A(object):
    def __init__(self, important_data):
        self.important_data = important_data
        
        # Add data which cannot be pickled:
        self.func = lambda: 7
        
        # Add data which should never be pickled, because it expires quickly:
        self.is_up_to_date = False
    
    def __getstate__(self):
        return [self.important_data] # only this is needed
    
    def __setstate__(self, state):
        self.important_data = state[0]
        
        self.func = lambda: 7  # just some hard-coded unpicklable function
        
        self.is_up_to_date = False  # even if it was before pickling

Ahora, esto se puede hacer:

>>> a1 = A('very important')
>>>
>>> s = pickle.dumps(a1)  # calls a1.__getstate__()
>>>
>>> a2 = pickle.loads(s)  # calls a1.__setstate__(['very important'])
>>> a2
<__main__.A object at 0x0000000002742470>
>>> a2.important_data
'very important'
>>> a2.func()
7

La implementación aquí muestra una lista con un valor: [self.important_data] . Eso fue solo un ejemplo, __getstate__ podría haber devuelto cualquier cosa que se pueda recoger, siempre y cuando __setstate__ sepa cómo hacer el oppoisite. Una buena alternativa es un diccionario de todos los valores: {'important_data': self.important_data} .

¡El constructor no se llama! Tenga en cuenta que en el ejemplo anterior, la instancia a2 se creó en pickle.loads sin haber llamado a A.__init__ , por lo que A.__setstate__ tuvo que inicializar todo lo que __init__ se habría inicializado si se hubiera llamado.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow