Estructuras de Datos en Python

¿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.

This entry was posted in Python and tagged , , . Bookmark the permalink.