¿Recuerdas los tiempos en que definías un struct en lenguaje C, lo tenias que guardar en un fichero binario y luego recuperarlo haciendo un bucle leyendo cada struct? Pero claro, para ello debías conocer como estaba definida la estructura, el programador original debía proporcionar la especificación…
Afortunadamente, los tiempos han cambiado, en Python disponemos del módulo Pickle que se encargará de esa tediosa labor de guardar y recuperar datos de un fichero.
Para ello escribiremos una pequeña pieza de código consistente en un agenda de telefonos (el ejemplo es funcional, se puede bajar y comprobar, hacer pruebas o lo que queráis):
#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# agenda.py
#
# Pequeña agenda telefonica
import sys
import pickle # Importamos el modulo #
import os
# Mostrar los contactos: Abrimos el archivo que contiene
# el diccionario, lo cargamos en su estructura en memoria,
# y recorremos los valores
#
def showContact():
fagenda = open(AgendaPath, "r")
agenda = pickle.load(fagenda)
fagenda.close
for telefono, nombre in agenda.iteritems():
print nombre + " ---> " + telefono
# Para añadir un contacto, tenemos que comprobar que es la primera
# vez que se ejecuta el programa, el fichero no existe, segun esta
# discriminacion, creamos el diccionario o abrimos el archivo para
# cargar el diccionario en memoria. El royo está en que para guardarlo
# el archivo tiene que estar vacio, y para leer el archivo no puede estar
# vacio, de aquí que se abra o cierre dos veces, igualmente, lo abres para
# leer y lo tienes que cerrar para abrirlo de nuevo y escribir.
#
def addContact():
nombre = input('Nombre: ')
telefono = input('Telefono: ')
if os.path.isfile(AgendaPath): # Si el fichero existe
fagenda = open(AgendaPath, "r") # Abrimos el fichero
agenda = pickle.load(fagenda) # Cargamos el diccionario
fagenda.close # Cerramos el fichero
fagenda = open(AgendaPath, "w") # Abrimos de nuevo el fichero
agenda[telefono] = nombre # Actualizamos el diccionario
pickle.dump(agenda, fagenda) # Volcamos el diccionario al fichero
fagenda.close # Cerramos el fichero
else:
agenda = {}
agenda[telefono] = nombre
fagenda = open(AgendaPath, "w")
pickle.dump(agenda,fagenda)
if len(sys.argv) < 2:
print "Uso: agenda.py add | show "
exit(1)
AgendaPath = "/home/nordri/sandbox/agendatelefonica/agenda.dat"
if (sys.argv[1] == 'add'):
addContact()
elif (sys.argv[1] == 'show'):
showContact()
else:
print "Error, opcion desconocida, " + sys.argv[1]
Aquí se muestra un diccionario por simplificar, pero Pickle tiene capacidad para guardar cualquier tipo abstracto que le pasemos. Posteriormente puede recuperarse desde el mismo programa o desde otro para intercambiar datos entre programas.
Para usar el ejemplo,
$ python agenda.py add Nombre: "Prueba" Telefono: "111"
Para mostrar los datos
$ python agenda.py show Prueba ---> 111 Prueba2 ---> 222 Prueba3 ---> 333
Quitando la falta de originalidad en los datos, creo que ha quedado bastante claro como podemos usar este módulo para conservar e intercambiar datos abstractos.


Comments are closed.