domingo, enero 26, 2014

Tratamiento de archivos .CSV en Python

Me gusta gusta mucho programar en Python porque es muy ágil a la hora de hacer prototipos y tiene un gran cantidad de herramientas. Una de las que he tenido que utilizar hace poco por temas de trabajo es el tratamiento de ficheros CSV.
Se trata de realizar una baremación de una lista de centros educativos que tengo en CSV y, como la hoja de cálculo no me acaba de convencer mucho, he hecho un pequeño scritp en Python que me ha resuelto la papeleta.
Se trata de asignar una puntuación a cada centro educativo dependiendo  del número de docentes que aporte a un proyecto (en cada fila tenemos a cada centro con sus docentes). Se sumará un punto por docente y tres puntos si en la lista hay docentes de dos especialidades distintas. Los archivos de salida con a su vez dos .csv: uno con la lista de centros y su baremación y otra con la lista de docentes.
Bueno, aquí pongo el programa como ejemplo de uso efectivo de la clase csv de Python:

#!/usr/bin/env python
#-*- coding:utf-8 -*-


import csv

centros = open('listadocentros.csv', 'a')
docentes = open('listadodocentes.csv', 'a')
writeCentros = csv.writer(centros)
writeDocentes = csv.writer(docentes)
fuente = open('in.csv','rb')
writeCentros.writerow( ('Id', 'Código Centro', 'Centro','Docentes aportados','Baremo') )
writeDocentes.writerow( ('COD.CENTRO', 'CENTRO','NIF', 'NOMBRE', 'APELLIDO1','APELLIDO2','ESPECIALIDAD') )

nOrLastField = 112 # numero de orden del ultimo campo
baremo = 0
c1 = 0 #criterio 1 de la convocatoria
c2 = 0 #criterio 2 de la convocatoria
c4 = 0 #criterio 4 de la convocatoria

try:

    reader = csv.reader(fuente)

    for index, row in enumerate(reader):
               
        k = 19
        baremo = 0
        tec = []
        epv = []
        codIes = row[2]
        ies = row[3]
            while k <= nOrLastField:

                if row[k] == "Sí":
                    if row[k + 1] == "Sí":
                         tec.append(True)
                         especialidad = "Tecnologías"
                    elif row[k + 2] == "Sí":
                         epv.append(True)
                         especialidad = "EPV"
                    writeDocentes.writerow( (codIes, ies, row[k - 6], row[k - 5], row[k - 4],row[k - 3] ,especialidad) )                 

                k = k + 10
        if (True in tec and True in epv): #Si hay docentes de plastica y tecnologias
            c4 = 3
        else:
            c4 = 0

        baremo = len(tec) + len(epv) + c4
        if len(tec) <> 0 or len(epv) <> 0:
           
            writeCentros.writerow( (row[0], row[2], row[3], str(len(tec) + len(epv)), str (baremo)) )
            print "Centro: ", row[0], row[2], row[3], str (baremo) + "    " +  "docentes aportados: ", str(len(tec) + len(epv))   
          
       
finally:


    fuente.close()
    centros.close()
    docentes.close()

PD. cada vez que se pruebe conviene vaciar de datos los archivos generados, esto se puede hace (desde la consola de gnu/linux por su puesto) con $cat /dev/null > archivo.csv

Otra cosa: Cuidado con las tabulaciones al cortar y pegar código.