A continuación, el código para un programa de agenda que utiliza archivos csv. Luego, los cambios necesarios para que la agenda que utilice archivos en formato pickle, en lugar de csv.
# agenda-csv.py: Agenda con los datos en csv
#!/usr/bin/env python
# encoding: latin1
import csv
ARCHIVO="agenda.csv"
CAMPOS=["Nombre","Apellido","Telefono","Cumpleaños"]
def leer_csv(datos_csv):
""" Devuelve la siguiente línea o None si se terminó el archivo. """
try:
return datos_csv.next()
except:
return None
def leer_datos(archivo):
""" Carga todos los datos del archivo en una lista y la devuelve. """
abierto = open(archivo)
datos_csv = csv.reader(abierto)
campos = leer_csv(datos_csv)
datos = []
elemento = leer_csv(datos_csv)
while elemento:
datos.append(elemento)
elemento = leer_csv(datos_csv)
abierto.close()
return datos
def guardar_datos(datos, archivo):
""" Guarda los datos recibidos en el archivo. """
abierto = open(archivo,"w")
datos_csv = csv.writer(abierto)
datos_csv.writerow(CAMPOS)
datos_csv.writerows(datos)
abierto.close()
def leer_busqueda():
""" Solicita al usuario nombre y apellido y los devuelve. """
nombre = raw_input("Nombre: ")
apellido = raw_input("Apellido: ")
return (nombre,apellido)
def buscar(nombre, apellido, datos):
""" Busca el primer elemento que coincida con nombre y con apellido. """
for elemento in datos:
if nombre in elemento[0] and apellido in elemento[1]:
return elemento
return None
def menu_alta(nombre, apellido, datos):
""" Pregunta si se desea ingresar un nombre y apellido y
de ser así, pide los datos al usuario. """
print "No se encuentra %s %s en la agenda." % (nombre, apellido)
confirmacion = raw_input("¿Desea ingresarlo? (s/n) ")
if confirmacion.lower() != "s":
return
telefono = raw_input("Telefono: ")
cumple = raw_input("Cumpleaños: ")
datos.append([nombre,apellido,telefono,cumple])
def mostrar_elemento(elemento):
""" Muestra por pantalla un elemento en particular. """
print
print " %s %s" % (elemento[0],elemento[1])
print "Telefono: %s" % elemento[2]
print "Cumpleaños: %s" % elemento[3]
print
def menu_elemento():
""" Muestra por pantalla las opciones disponibles para un elemento
existente. """
o = raw_input("b: borrar, m: modificar, ENTER para continuar (b/m): ")
return o.lower()
def modificar(viejo, nuevo, datos):
""" Reemplaza el elemento viejo con el nuevo, en la lista datos."""
indice = datos.index(viejo)
datos[indice] = nuevo
def menu_modificacion(elemento, datos):
""" Solicita al usuario los datos para modificar una entrada. """
nombre = raw_input("Nuevo nombre: ")
apellido = raw_input("Nuevo apellido: ")
telefono = raw_input("Nuevo teléfono: ")
cumple = raw_input("Nuevo cumpleaños: ")
modificar(elemento, [nombre, apellido, telefono, cumple], datos)
def baja(elemento, datos):
""" Elimina un elemento de la lista. """
datos.remove(elemento)
def confirmar_salida():
""" Solicita confirmación para salir """
confirmacion = raw_input("¿Desea salir? (s/n) ")
return confirmacion.lower() == "s"
def agenda():
""" Función principal de la agenda.
Carga los datos del archivo, permite hacer búsquedas, modificar
borrar, y al salir guarda. """
datos = leer_datos(ARCHIVO)
fin = False
while not fin:
(nombre, apellido) = leer_busqueda()
if nombre == "" and apellido == "":
fin = confirmar_salida()
continue
elemento = buscar(nombre, apellido, datos)
if not elemento:
menu_alta(nombre, apellido, datos)
continue
mostrar_elemento(elemento)
opcion = menu_elemento()
if opcion == "m":
menu_modificacion(elemento, datos)
elif opcion == "b":
baja(elemento, datos)
guardar_datos(datos, ARCHIVO)
agenda()
# agenda-pickle.py: Diferencia de agenda con datos en pickle
import pickle
ARCHIVO="agenda.dat"
def leer_datos(archivo):
""" Carga todos los datos del archivo en una lista y la devuelve."""
abierto = open(archivo)
datos = pickle.load(archivo)
abierto.close()
return datos
def guardar_datos(datos, archivo):
""" Guarda los datos recibidos en el archivo. """
abierto = open(archivo,"w")
pickle.dump(archivo, datos)
abierto.close()
Copyright (c) 2011-2014 Rosita Wachenchauzer, Margarita Manterola,
Maximiliano Curia, Marcos Medrano, Nicolás Paez.
La copia y redistribución de esta página se permite bajo los términos
de la licencia Creative Commons Atribución - Compartir Obras Derivadas
Igual 3.0 siempre que se conserve esta nota de copyright.