text: # 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_datos(archivo):
      """ Carga todos los datos del archivo en una lista y la devuelve. """
      with open(ARCHIVO, newline='') as csvfile:
          first_line = True;
          datos_csv = csv.reader(csvfile)
          datos = []
  
          campos = {}
          for row in datos_csv:
              if(first_line):
                  elemento = row
                  first_line = False
              else:
                  datos.append(row)
      return datos
  
  def guardar_datos(datos, archivo):
      """ Guarda los datos recibidos en el archivo. """
      abierto = open(archivo,"w", newline='')
      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 = input("Nombre: ")
      apellido = 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 = input("¿Desea ingresarlo? (s/n) ")
      if confirmacion.lower() != "s":
          return
      telefono = input("Telefono: ")
      cumple = 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 = 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 = input("Nuevo nombre: ")
      apellido = input("Nuevo apellido: ")
      telefono = input("Nuevo teléfono: ")
      cumple = 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 = 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()