CodeGym /Cursos /Python SELF ES /Trabajo con pickle

Trabajo con pickle

Python SELF ES
Nivel 22 , Lección 1
Disponible

9.1 Introducción a pickle

El módulo pickle te permite guardar prácticamente cualquier objeto de Python en un archivo o cadena, y luego restaurarlo a su estado original. pickle soporta muchos tipos de datos, incluyendo objetos personalizados de clases, y automatiza el proceso de convertir objetos a formato de bytes y viceversa.

Funciones principales del módulo pickle

  • Lectura y escritura de un objeto en un archivo
    • pickle.dump(obj, file): Serializa el objeto obj y lo escribe en el archivo abierto file.
    • pickle.load(file): Lee desde el archivo file y deserializa el objeto.
  • Lectura y escritura de un objeto en un array de bytes
    • pickle.dumps(obj): Serializa el objeto obj y lo devuelve como un objeto de bytes.
    • pickle.loads(bytes): Deserializa el objeto desde un objeto de bytes.

A continuación, vamos a analizarlas un poco más en detalle:

9.2 Serialización en archivo

Pasos principales para la serialización en archivo:

  1. Abrir el archivo en modo de escritura de bytes (wb).
  2. Serializar un objeto usando pickle.dump(obj, file).
  3. Para deserializar el objeto usamos pickle.load(file).
  4. Cerrar el archivo.

Serialización y deserialización de un objeto en archivo

Básicamente a pickle no le importa qué serializar. Por ejemplo, así es como se ve la serialización de una lista:


import pickle

data = [1, 2, 3, 4, 5]
            
# Serialización de la lista en archivo
with open('list.pkl', 'wb') as file:
    pickle.dump(data, file)
            
# Deserialización de la lista desde archivo
with open('list.pkl', 'rb') as file:
    loaded_data = pickle.load(file)
            
print(loaded_data)  # Salida: [1, 2, 3, 4, 5]

Y así es como se ve la serialización de un objeto diccionario:


import pickle

# Ejemplo de objeto para serializar
data = {'name': 'Alice', 'age': 30, 'is_student': False}
            
# Serialización del objeto en archivo
with open('data.pkl', 'wb') as file:
    pickle.dump(data, file)
            
# Deserialización del objeto desde archivo
with open('data.pkl', 'rb') as file:
    loaded_data = pickle.load(file)
            
print(loaded_data)  # Salida: {'name': 'Alice', 'age': 30, 'is_student': False}

Queremos guardar un objeto — llamamos a dump(), queremos cargarlo — llamamos a load(). Fácil.

9.3 Serialización en cadena

Muy a menudo necesitas pasar objetos por la red, así que hay que guardar el objeto no en un archivo sino en una cadena. Para ello, pickle tiene los métodos dumps y loads con una s adicional al final.

Acciones principales para la serialización y deserialización en cadena (o array de bytes):

  • Serializar un objeto usando pickle.dumps(obj).
  • Para deserializar un objeto usamos pickle.loads(data).

Serialización y deserialización de un objeto en cadena

Serializar un objeto en cadena (o conjunto de bytes) es aún más sencillo — solo necesitas llamar a un método — dumps().

Ejemplo:


import pickle

# Ejemplo de objeto para serializar
data = {'name': 'Bob', 'age': 25, 'is_student': True}
            
# Serialización del objeto en cadena
serialized_data = pickle.dumps(data)
print(serialized_data)
            
# Deserialización del objeto desde cadena
loaded_data = pickle.loads(serialized_data)
print(loaded_data)  # Salida: {'name': 'Bob', 'age': 25, 'is_student': True}

9.4 Errores al serializar

A veces al serializar ocurren errores. En este caso, el módulo pickle lanzará excepciones:

  • pickle.PicklingError — error durante la serialización.
  • pickle.UnpicklingError — error durante la deserialización.

Ejemplos:


import pickle

data = {'key': 'value'}
            
try:
    # Serialización del objeto en archivo
    with open('data.pkl', 'wb') as file:
        pickle.dump(data, file)
except pickle.PicklingError as e:
    print(f"Error de serialización: {e}")
            
try:
    # Deserialización del objeto desde archivo
    with open('data.pkl', 'rb') as file:
        loaded_data = pickle.load(file)
    print(loaded_data)
except pickle.UnpicklingError as e:
    print(f"Error de deserialización: {e}")

Normalmente, como programador, no puedes hacer mucho sobre un error de serialización/deserialización durante el funcionamiento del programa. Todo lo que puedes hacer es guardarlo en el log, para luego investigar por qué sucedió.

La razón principal de estos errores suele ser el cambio en el formato del objeto. Tú has guardado un objeto en un archivo, luego tu programa se actualiza, y el objeto tiene nuevos campos o le faltan algunos antiguos. Y el objeto guardado intenta cargarse en la clase del nuevo objeto...

De nuevo, esta situación es frecuente al trabajar con red — el programa versión 2.18 envía un objeto ligeramente diferente del que espera el programa versión 3.1. Esto se llama un problema de migración, y se enfrenta a menudo en proyectos de larga duración y alta demanda.

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION