miércoles, mayo 11, 2011

Importando desde CSV con Python

Siendo Excel la herramienta más común en todas las pequeñas y medianas empresas, es casi ley que los proyectos inicien con datos ya capturados en tablas. Estas tablas las exporto y las ordeno de acuerdo a mis necesidades.
Comúnmente las exporto a CSV, delimitado por coma con doble comilla como separador.
Creo mi modelo en forma declarativa.
class CoberturaCame(DeclarativeBase):
    """ Beneficios Adicionales """
    __tablename__ = "came"
    
    #{ Columns
    
    id = Column(Integer, autoincrement=True, primary_key=True)    
    tipo = Column(Integer)
    vendedor = Column(Unicode(32))
    edad_inf = Column(u'edad_inf', Integer, nullable=True)
    edad_sup = Column(u'edad_sup', Integer, nullable=True)
    hombre = Column(Float(precision=2), default=0.0)
    mujer = Column(Float(precision=2), default=0.0)
    
    #}
    
    #{ Helpers

    def from_csv_row(self, row):
        self.tipo = row[1]
        self.vendedor = row[2]
        self.edad_inf = row[3]
        self.edad_sup = row[4]
        self.hombre = row[5]
        self.mujer = row[5]
            
    
    @classmethod
    def by_edad_tipo(cls, edad, tipo):
        """Return the BenAdicionales object whose edad is between``edad``."""
        return DBSession.query(cls).filter(
            and_(cls.edad_inf <= edad, 
                cls.edad_sup >= edad,
                cls.tipo==tipo)).first()
        
    #}

y agrego una simple rutina de importación.

from miproyecto import model
import cvs

csvreader = csv.reader(open('res/janem_cobertura_came.csv'))
# skip first row
csvreader.next()
for row in csvreader:
    if len(row) == 0:
        continue
    d = model.CoberturaCame()
    
    d.from_csv_row(row)
    
    model.DBSession.add(d)

model.DBSession.flush()

La función miembro from_csv_row(row) definida en el modelo, es una ayuda visual y no tiene otro propósito mas que copiar los valores de la fila a un objeto nuevo. En algunos casos pudiera servir para realizar alguna transformación como fechas, minúsculas y mayúsculas o alguna operación aritmética antes de entrar. Aunque yo aconsejo realizar todas esas transformaciones desde la tabla de Excel y exportar el CSV ya listo para importar.

Cabe mencionar que las cantidades numéricas deben de estar sin formato, por que los caractéres '$' o las ',' dentro de las cifras confunden el lector de python.

No hay comentarios.: