Módulo pickle¶
Este módulo nos permite almacenar fácilmente colecciones y objetos en ficheros binarios abstrayendo todo la parte de escritura y lectura binaria.
Escritura de colecciones¶
import pickle
# Podemos guardar lo que queramos, listas, diccionarios, tuplas...
lista = [1,2,3,4,5]
# Escritura en modo binario, vacía el fichero si existe
fichero = open('lista.pckl','wb')
# Escribe la colección en el fichero 
pickle.dump(lista, fichero) 
fichero.close()
Lectura de colecciones¶
# Lectura en modo binario 
fichero = open('lista.pckl','rb') 
# Cargamos los datos del fichero
lista_fichero = pickle.load(fichero)
print(lista_fichero)
fichero.close()
[1, 2, 3, 4, 5]
Persistencia de objetos¶
Para guardar objetos lo haremos dentro de una colección. La lógica sería la siguiente:
- Crear una colección.
- Introducir los objetos en la colección.
- Guardar la colección haciendo un dump.
- Recuperar la colección haciendo un load.
- Seguir trabajando con nuestros objetos.
# Creamos una clase de prueba
class Persona:
    def __init__(self,nombre):
        self.nombre = nombre
    def __str__(self):
        return self.nombre
# Creamos la lista con los objetos
nombres = ["Héctor","Mario","Marta"]
personas = []
for n in nombres:
    p = Persona(n)
    personas.append(p)
# Escribimos la lista en el fichero con pickle
import pickle
f = open('personas.pckl','wb')
pickle.dump(personas, f)
f.close()
# Leemos la lista del fichero con pickle
f = open('personas.pckl','rb')
personas = pickle.load(f)
f.close()
for p in personas:
    print(p)
Héctor
Mario
Marta
Ejemplo catálogo de películas¶
A continuación os dejo un ejemplo para que veáis como adaptar un catálogo de películas para usar persistencia utilizando pickle:
from io import open
import pickle
class Pelicula:
    # Constructor de clase
    def __init__(self, titulo, duracion, lanzamiento):
        self.titulo = titulo
        self.duracion = duracion
        self.lanzamiento = lanzamiento
        print('Se ha creado la película:',self.titulo)
    def __str__(self):
        return '{} ({})'.format(self.titulo, self.lanzamiento)
class Catalogo:
    peliculas = []
    # Constructor de clase
    def __init__(self):
        self.cargar()
    def agregar(self,p):
        self.peliculas.append(p)
        self.guardar()
    def mostrar(self):
        if len(self.peliculas) == 0:
            print("El catálogo está vacío")
            return
        for p in self.peliculas:
            print(p)
    def cargar(self):
        fichero = open('catalogo.pckl', 'ab+')
        fichero.seek(0)
        try:
            self.peliculas = pickle.load(fichero)
        except:
            print("El fichero está vacío")
        finally:
            fichero.close()
            print("Se han cargado {} películas".format(len(self.peliculas)))
    def guardar(self):
        fichero = open('catalogo.pckl', 'wb')
        pickle.dump(self.peliculas, fichero)
        fichero.close()
El uso de las clases no tendría mucha complicación:
# Creamos un catálogo
c = Catalogo()
# Mostramos el contenido
c.mostrar()
# Agregamos unas películas
c.agregar( Pelicula("El Padrino", 175, 1972) )
c.agregar( Pelicula("El Padrino: Parte 2", 202, 1974) )
# Mostramos el catálogo de nuevo
c.mostrar()
# Borramos el catálogo de la memoria ram (persistirá el fichero)
del(c)
El fichero está vacío
Se han cargado 0 películas
El catálogo está vacío
Se ha creado la película: El Padrino
Se ha creado la película: El Padrino: Parte 2
El Padrino (1972)
El Padrino: Parte 2 (1974)
Ahora al crear de nuevo un catálogo se recuperarán los datos del fichero y podríamos seguir trabajando con él:
# Creamos un catálogo
c = Catalogo()
# Mostramos el contenido
c.mostrar()
# Agregamos una película
c.agregar( Pelicula("Prueba", 100, 2005) )
# Mostramos el catálogo de nuevo
c.mostrar()
Se han cargado 2 películas
El Padrino (1972)
El Padrino: Parte 2 (1974)
Se ha creado la película: Prueba
El Padrino (1972)
El Padrino: Parte 2 (1974)
Prueba (2005)
En conclusión podríamos decir que en realidad estamos volcando los datos del fichero a la memoria RAM y los manipulamos ahí.
Última edición: 3 de Octubre de 2018