41. Guardado permanente
Vídeo
Notas personales
En esta lección, continuaremos estudiando cómo guardar datos de forma permanente en ficheros externos, reforzando así los contenidos aprendidos hasta el momento.
Empecemos importando la librería pickle
y creando una clase sencilla: Persona
.
import pickle
class Persona:
def __init__(self, nombre, genero, edad):
self.nombre = nombre
self.genero = genero
self.edad = edad
print("Se ha creado una persona nueva con el nombre de", self.nombre)
def __str__(self):
return "{} {} {}".format(self.nombre, self.genero, self.edad)
Nota: el método __str__()
convierte en cadena de texto la información de un objeto.
Así, si ahora tecleamos:
sandra = Persona("Sandra", "Femenino", "29")
Se ha creado una persona nueva con el nombre de Sandra
El objetivo será crear algunos objetos de dicha clase, almacenarlos en una lista (empresa que realizaremos a través de otra clase, ListaPersonas
) y después volcar la información en un fichero externo, al cual podamos acceder en cualquier instante.
import pickle
class Persona:
def __init__(self, nombre, genero, edad):
self.nombre = nombre
self.genero = genero
self.edad = edad
print("Se ha creado una persona nueva con el nombre de", self.nombre)
def __str__(self):
return "{} {} {}".format(self.nombre, self.genero, self.edad)
class ListaPersonas:
personas = []
def agregar_personas(self, persona):
self.personas.append(persona)
def mostrar_personas(self):
for persona in self.personas:
print(persona.__str__())
lista_personas = ListaPersonas()
sandra = Persona("Sandra", "Femenino", "29")
lista_personas.agregar_personas(sandra)
antonio = Persona("Antonio", "Masculino", "39")
lista_personas.agregar_personas(antonio)
ana = Persona("Ana", "Femenino", "20")
lista_personas.agregar_personas(ana)
lista_personas.mostrar_personas()
Se ha creado una persona nueva con el nombre de Sandra
Se ha creado una persona nueva con el nombre de Antonio
Se ha creado una persona nueva con el nombre de Ana
Sandra Femenino 29
Antonio Masculino 39
Ana Femenino 20
Almacenemos ahora la lista de personas que hemos generado en un fichero externo. Para ello, incluiremos los pasos necesarios del mencionado proceso en el constructor de la clase ListaPersonas
:
class ListaPersonas:
personas = []
def __init__(self):
fichero = open("lista_de_personas", "ab+")
fichero.seek(0) # Desplazamos cursor al principio
try:
self.personas = pickle.load(fichero) # Cargamos información
print("Se cargaron {} personas.".format(len(self.personas)))
except EOFError:
print("El fichero está vacío.") # Para la primera vez que abrimos
finally:
fichero.close()
del fichero
def agregar_personas(self, persona):
self.personas.append(persona)
def mostrar_personas(self):
for persona in self.personas:
print(persona.__str__())
lista_personas = ListaPersonas()
El fichero está vacío.
Nota: en la función open()
, el valor del argumento "ab+"
nos permite agregar información a un fichero de codificación binaria.
A continuación, modifiquemos el método agregar_personas()
para que una vez añadida a la lista la nueva información, la almacene en el fichero externo.
class ListaPersonas:
personas = []
def __init__(self):
fichero = open("lista_de_personas", "ab+")
fichero.seek(0) # Desplazamos cursor al principio
try:
self.personas = pickle.load(fichero) # Cargamos información
print("Se cargaron {} personas.".format(len(self.personas)))
except EOFError:
print("El fichero está vacío.") # Para la primera vez que abrimos
finally:
fichero.close()
del fichero
def agregar_personas(self, persona):
self.personas.append(persona)
self.guardar_personas()
def mostrar_personas(self):
for persona in self.personas:
print(persona.__str__())
def guardar_personas(self):
fichero = open("lista_de_personas", "wb")
pickle.dump(self.personas, fichero)
fichero.close()
del fichero
Así, si ejecutamos ahora el siguiente bloque de código:
lista_personas = ListaPersonas()
sandra = Persona("Sandra", "Femenino", "29")
lista_personas.agregar_personas(sandra)
antonio = Persona("Antonio", "Masculino", "39")
lista_personas.agregar_personas(antonio)
ana = Persona("Ana", "Femenino", "20")
lista_personas.agregar_personas(ana)
El fichero está vacío.
Se ha creado una persona nueva con el nombre de Sandra
Se ha creado una persona nueva con el nombre de Antonio
Se ha creado una persona nueva con el nombre de Ana
Recuperemos la información guardada en el fichero externo, utilizando para ello un método que añadiremos a la clase ListaPersonas
, mostrar_informacion
:
class ListaPersonas:
personas = []
def __init__(self):
fichero = open("lista_de_personas", "ab+")
fichero.seek(0) # Desplazamos cursor al principio
try:
self.personas = pickle.load(fichero) # Cargamos información
print("Se cargaron {} personas.".format(len(self.personas)))
except EOFError:
print("El fichero está vacío.") # Para la primera vez que abrimos
finally:
fichero.close()
del fichero
def agregar_personas(self, persona):
self.personas.append(persona)
self.guardar_personas()
def mostrar_personas(self):
for persona in self.personas:
print(persona.__str__())
def guardar_personas(self):
fichero = open("lista_de_personas", "wb")
pickle.dump(self.personas, fichero)
fichero.close()
del fichero
def mostrar_informacion(self):
print("La información del fichero externo es la siguiente:")
for persona in self.personas:
print(persona.__str__())
Así,
lista_personas.mostrar_informacion()
La información del fichero externo es la siguiente:
Sandra Femenino 29
Antonio Masculino 39
Ana Femenino 20
Agreguemos una nueva persona. Para ello, tecleamos por ejemplo:
juan = Persona("Juan", "Masculino", "47")
lista_personas.agregar_personas(juan)
lista_personas.mostrar_informacion()
Se ha creado una persona nueva con el nombre de Juan
La información del fichero externo es la siguiente:
Sandra Femenino 29
Antonio Masculino 39
Ana Femenino 20
Juan Masculino 47
Código fuente
El código fuente y los posibles ficheros externos generados correspondientes a esta lección se encuentran disponibles para su consulta en la carpeta /lecciones/41/
del
repositorio.