Ver índice de contenidos del libro

13.2. Apareo

Así como el corte de control nos sirve para generar un reporte, el apareo nos sirve para asociar/relacionar datos que se encuentran en distintos archivos.

La idea básica es: a partir de dos archivos (uno principal y otro relacionado) que tienen alguna información que los enlace, generar un tercero (o una salida por pantalla), como una mezcla de los dos.

Para hacer esto es conveniente que ambos archivos estén ordenados por el valor que los relaciona.

Ejemplo

Por ejemplo, si se tiene un archivo con un listado de alumnos (padrón, apellido, nombre, carrera), y otro archivo que contiene las notas de esos alumnos (padrón, materia, nota), y se quieren listar todas las notas que corresponden a cada uno de los alumnos, se lo puede hacer de la siguiente manera.

# notas.py: Recorre un archivo de alumnos y otro de notas e imprime
#           las notas que corresponden a cada alumno
 
#!/usr/bin/env python
# encoding: latin1
import csv
 
def leer_datos(datos):
    """ Obtiene el siguiente registro, o devuelve None si llegó al fin
        del archivo. """
    try:
        return datos.next()
    except:
        return None
 
def imprimir_notas_alumnos(alumnos, notas):
    """ Abre los archivos de alumnos y notas, y por cada alumno imprime
        todas las notas que le corresponden."""
    notas_a = open(notas)
    alumnos_a = open(alumnos)
    notas_csv = csv.reader(notas_a)
    alumnos_csv = csv.reader(alumnos_a)
 
    # Saltea los encabezados
    leer_datos(notas_csv)
    leer_datos(alumnos_csv)
 
    # Empieza a leer
    alumno = leer_datos(alumnos_csv)
    nota = leer_datos(notas_csv)
    while (alumno):
        print alumno[2]+", "+alumno[1]+" - "+alumno[0]
        if (not nota or nota[0] != alumno[0]):
            print "\tNo se registran notas"
        while (nota and nota[0] == alumno[0]):
            print "\t"+nota[1]+": "+nota[2]
            nota = leer_datos(notas_csv)
        alumno = leer_datos(alumnos_csv)
 
    # Cierro los archivos
    notas_a.close()
    alumnos_a.close()
 
imprimir_notas_alumnos("alumnos.csv", "notas.csv")

En el ejemplo anterior usamos apareo de datos para combinar y mostrar información, de forma similar se puede utilizar para agregar información nueva, borrar información o modificar datos de la tabla principal. Gran parte de las bases de datos relacionales basan su funcionamiento en estas funcionalidades.

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.