Foros del Web » Programando para Internet » Python »

leer 2 archivos de excel con diferentes estructuras

Estas en el tema de leer 2 archivos de excel con diferentes estructuras en el foro de Python en Foros del Web. Hola tengo un programa que me lee archivos de excel esta echo en python 2.7 con Django 1.6.5 para leer el archivo de excel estoy ...
  #1 (permalink)  
Antiguo 11/09/2014, 16:53
 
Fecha de Ingreso: julio-2011
Ubicación: Peru
Mensajes: 92
Antigüedad: 12 años, 9 meses
Puntos: 1
leer 2 archivos de excel con diferentes estructuras

Hola tengo un programa que me lee archivos de excel esta echo en python 2.7 con Django 1.6.5
para leer el archivo de excel estoy usando la libreria "xlrd"

Mi programa lee y guarda la data del excel en una BD, el primer(Ripley) archivo de excel tiene una estructura, el segundo archivo(Saga) de excel su estructura es diferente al primero(Ripley) y no guarda la data del segundo archivo de excel , le dejo el codigo espero su pronta ayuda

MODELS.PY

Código Python:
Ver original
  1. class DataExcel(models.Model):
  2.     tienda = (
  3.         (1,'Ripley'),
  4.         (2,'Saga')
  5.     )
  6.  
  7.  
  8.     name = models.CharField('Nombre', max_length=20)
  9.     fecha_inicio = models.DateField(verbose_name='Fecha inicio', max_length=10)
  10.     fecha_fin = models.DateField(verbose_name='Fecha Fin', max_length=10)
  11.     file = models.FileField(upload_to=settings.MEDIA_ROOT,verbose_name='Archivo')
  12.     tienda = models.IntegerField(choices=tienda)
  13.     active = models.BooleanField(default=True)
  14.  
  15. class Saga(models.Model):
  16.  
  17.     Id_DataExcel = models.ForeignKey(DataExcel)
  18.     Codigo = models.IntegerField(max_length=10, blank=True)
  19.     Consignacion = models.CharField(max_length=20, blank=True)
  20.     Tipo_Trx = models.CharField(max_length=20, blank=True)
  21.     Fecha_proceso = models.DateField()
  22.     Fecha_Trx = models.DateField()
  23.     Local = models.CharField(max_length=30)
  24.     Ccosto = models.CharField(max_length=30)
  25.     SubClase = models.CharField(max_length=30)
  26.     Ean =  models.IntegerField(max_length=60, blank=True)
  27.     Sku = models.IntegerField(max_length=60, blank=True)
  28.     Descripcion_Sku = models.CharField(max_length=200, blank=True)
  29.     Caja_Vta = models.IntegerField(max_length=60, blank=True)
  30.     Nro_Trx_Vta = models.IntegerField(max_length=60, blank=True)
  31.     Cantidad = models.FloatField()
  32.     Base_imponible_vta = models.FloatField()
  33.     Impto_vta = models.FloatField()
  34.     Monto_timbrado_vta = models.FloatField()
  35.     Tipo_comision = models.CharField(max_length=60, blank=True)
  36.     Monto_comision = models.IntegerField(max_length=20, blank=True)
  37.     Costo_vta = models.FloatField()
  38.     Igv_costo_vta = models.FloatField()
  39.     Total_costo_vta = models.FloatField()
  40.     Local_Trx_Ori = models.IntegerField(max_length=60, blank=True)
  41.     Fecha_Trx_Ori = models.DateField()
  42.     Caja_Trx_Ori = models.IntegerField(max_length=20, blank=True)
  43.     Nro_Trx_ori = models.IntegerField(max_length=20, blank=True)
  44.  
  45.  
  46.  
  47. class Ripley(models.Model):
  48.  
  49.     Id_DataExcel = models.ForeignKey(DataExcel)
  50.     CodSucursal = models.IntegerField(max_length=60, blank=True)
  51.     Sucursal = models.CharField(max_length=60, blank=True)
  52.     CodDivision = models.CharField(max_length=200, blank=True)
  53.     Division = models.CharField(max_length=300, blank=True)
  54.     CodArea = models.CharField(max_length=60, blank=True)
  55.     Area = models.CharField(max_length=30, blank=True)
  56.     CodDpto = models.CharField(max_length=60, blank=True)
  57.     Dpto = models.CharField(max_length=35, blank=True)
  58.     CodLinea = models.IntegerField(max_length=200, blank=True)
  59.     Linea = models.CharField(max_length=35, blank=True)
  60.     CodSubLinea = models.CharField(max_length=200, blank=True)
  61.     SubLinea = models.CharField(max_length=200, blank=True)
  62.     CodModelo = models.IntegerField(max_length=60, blank=True)
  63.     Modelo = models.CharField(max_length=50, blank=True)
  64.     CodVariacion = models.IntegerField(max_length=60, blank=True)
  65.     Variacion = models.CharField(max_length=50, blank=True)
  66.     CodMarca = models.IntegerField(max_length=200, blank=True)
  67.     Marca = models.CharField(max_length=60, blank=True)
  68.     CodProveedor = models.IntegerField(max_length=200, blank=True)
  69.     Proveedor = models.CharField(max_length=60, blank=True)
  70.     Temporada = models.CharField(max_length=60, blank=True)
  71.     Procedencia = models.CharField(max_length=60, blank=True)
  72.     TipoNeg = models.CharField(max_length=15, blank=True)
  73.     Color = models.CharField(max_length=200, blank=True)
  74.     Talla = models.CharField(max_length=200, blank=True)
  75.     SemAntig = models.CharField(max_length=200, blank=True)
  76.     ConVenta = models.CharField(max_length=200, blank=True)
  77.     ConStockOH = models.CharField(max_length=200, blank=True)
  78.     EsRebate = models.CharField(max_length=200, blank=True)
  79.     ConCobertura = models.CharField(max_length=200, blank=True)
  80.     VtaUnd = models.CharField(max_length=200, blank=True)
  81.     VtaSMF = models.FloatField()
  82.     Contr = models.FloatField()
  83.     Costo = models.FloatField()
  84.     Stock_OH = models.CharField(max_length=200, blank=True)
  85.     Costo_OH = models.FloatField()
  86.     Cbt = models.CharField(max_length=200, blank=True)

VIEWS.PY

Código Python:
Ver original
  1. class DataExcelProcessView(TemplateView):
  2.     template_name = 'app/volver.html'
  3.  
  4.     def get(self, request, *args, **kwargs):
  5.         return super(DataExcelProcessView, self).get(request, args, kwargs)
  6.  
  7.     def get_context_data(self, **kwargs):
  8.         ctx = super(DataExcelProcessView, self).get_context_data(**kwargs)
  9.         ctx['lista_data'] = self.process_file()
  10.         return ctx
  11.  
  12.     def process_file(self):
  13.         object = DataExcel.objects.get(pk=self.kwargs['pk'])
  14.         book = xlrd.open_workbook(object.file.path)
  15.         hoja1 = book.sheet_by_index(0)
  16.  
  17.         print object.tienda
  18.  
  19.         if object.tienda == 1:
  20.  
  21. #=============================================RIPLEY============================================================
  22.  
  23.             fields = ('CodSucursal', 'Sucursal', 'CodDivision', 'Division', 'CodArea', 'Area', 'CodDpto', 'Dpto', 'CodLinea',
  24.                         'Linea', 'CodSubLinea', 'SubLinea', 'CodModelo', 'Modelo', 'CodVariacion', 'Variacion', 'CodMarca',
  25.                         'Marca', 'CodProveedor', 'Proveedor', 'Temporada', 'Procedencia', 'TipoNeg', 'Color', 'Talla',
  26.                         'SemAntig', 'ConVenta', 'ConStockOH', 'EsRebate', 'ConCobertura', 'VtaUnd', 'VtaSMF', 'Contr',
  27.                         'Costo', 'Stock_OH', 'Costo_OH', 'Cbt')
  28.  
  29.             products = [Ripley(Id_DataExcel=DataExcel.objects.get(pk=object.id),**{fields[i]: cell for i, cell in enumerate(hoja1.row_values(rowid))})  # recorrido para guardar la data
  30.                         for rowid in range(1, hoja1.nrows)]
  31.  
  32.  
  33.             for product in products:
  34.                 product.Color = str(product.Color).replace('.0', '')
  35.                 product.Talla = str(product.Talla).replace('.0', '')
  36.                 product.SemAntig = str(product.SemAntig).replace('.0', '')
  37.                 product.VtaUnd = str(product.VtaUnd).replace('.0', '')
  38.                 product.Stock_OH = str(product.Stock_OH).replace('.0', '')
  39.                 product.Cbt = str(product.Cbt).replace('.0', '')
  40.  
  41.             try:
  42.                 Ripley.objects.bulk_create(products)
  43.                 data_excel = DataExcel.objects.get(pk=object.id)
  44.                 data_excel.active = False
  45.                 data_excel.save()
  46.             except IntegrityError as e:
  47.                     return False
  48.  
  49.         elif object.tienda == 2:
  50. #=============================================SAGA============================================================
  51.             fields = ( 'Codigo','Consignacion','Tipo Trx.','Fecha Proceso','Fecha Trx.','Local',
  52.                         'Ccosto','SubClase','EAN','Sku','Descripcion Sku','Caja Vta','Nro.Trx. Vta','Cantidad',
  53.                         'Base Imponible Vta','Impto Vta','Monto Timbrado Vta','Tipo Comision','Monto Comision',
  54.                         'Costo Vta','IGV Costo Vta','Total Costo Vta','Local Trx Ori','Fecha Trx Ori','Caja Trx Ori','Nro Trx Ori')
  55.  
  56.             products_saga = [Saga(Id_DataExcel=DataExcel.objects.get(pk=object.id),**{fields[i]: cell for i, cell in enumerate(hoja1.row_values(rowid))})  # recorrido para guardar la data
  57.                              for rowid in range(6, hoja1.nrows)]
  58.  
  59.             try:
  60.                 Saga.objects.bulk_create(products_saga)
  61.                 data_excel = DataExcel.objects.get(pk=object.id)
  62.                 data_excel.active = False
  63.                 data_excel.save()
  64.             except IntegrityError as e:
  65.                     return False


esperando su pronta ayuda
  #2 (permalink)  
Antiguo 11/09/2014, 17:40
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: leer 2 archivos de excel con diferentes estructuras

Solo faltan un par de datos:

1. ¿Que error arroja? (Pon el nombre la excepción, el valor y stacktrace)
2. ¿No arroja ningún error, entonces cual es el problema? (¿Que hace? vs ¿Que debería de hacer?)

Veo que tienes muchos errores:
1. No haces un override correcto del método get. Y peor aun no lo necesitas.
2. Cada vez que haces una petición ya sea GET o no, siempre procesas el archivo. Tal vez debería ser una sola vez. De preferencia cuando creas el objeto DataExcel.
3. Tienes problemas de indentación donde atrapas las excepciones.
4. Veo que list_data debería de retornar una lista de datos, pero solo veo que retorna False.

Mientras no conteste las preguntas que puse dudo mucho que pueda adivinar cual sea el problema.
  #3 (permalink)  
Antiguo 12/09/2014, 09:21
 
Fecha de Ingreso: julio-2011
Ubicación: Peru
Mensajes: 92
Antigüedad: 12 años, 9 meses
Puntos: 1
Respuesta: leer 2 archivos de excel con diferentes estructuras

mi problema es que cuando elijo la opcion 1(Ripley) si lee y guarda los datos en tabla Ripley, pero cuando elijo la opcion 2(Saga) si lee pero no guarda los datos en mi tabla Saga
y no me bota ningun error
esperando su pronta ayuda
  #4 (permalink)  
Antiguo 12/09/2014, 11:50
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: leer 2 archivos de excel con diferentes estructuras

El único escenario que se me ocurre es que products_saga sea una lista vacía.

Otro escenario podría ser que este lanzando un error IntegrityError pero nunca tratas de resolver ese error solo pones return False.
  #5 (permalink)  
Antiguo 12/09/2014, 15:13
 
Fecha de Ingreso: julio-2011
Ubicación: Peru
Mensajes: 92
Antigüedad: 12 años, 9 meses
Puntos: 1
Respuesta: leer 2 archivos de excel con diferentes estructuras

el excel 2(Saga) los datos que debo cargar comienzan desde la fila(row) 6, pero sin embargo veo que cuando lee el excel lo haces de la fila 1, cuando en las fila del 1 al 5 no no hay nada creo que ese es el error
como le digo ¿ que me lee desde la fila 6 ?
pense que poniendo esto
Código Python:
Ver original
  1. for rowid in range(6, hoja1.nrows)]
lo haria pero no lo hace alguna ayuda o sugerencia
  #6 (permalink)  
Antiguo 12/09/2014, 16:19
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: leer 2 archivos de excel con diferentes estructuras

Dado que no hay error (lanza alguna excepción) y algunas de las acciones parecen incongruentes. Te recomiendo que depures el proyecto.

Puedes hacerlo con pdb aquí te dicen como:
http://stackoverflow.com/questions/1...o-the-good-way

O si prefieres hacerlo con IDE como PyCharm,
  #7 (permalink)  
Antiguo 12/09/2014, 16:30
 
Fecha de Ingreso: julio-2011
Ubicación: Peru
Mensajes: 92
Antigüedad: 12 años, 9 meses
Puntos: 1
Respuesta: leer 2 archivos de excel con diferentes estructuras

lo estoy depurando con el Pycharm por eso me di cuenta lo dle excel que no lee desde la rows 6 , si no lle desde 1

Etiquetas: django, estructuras, excel, ip
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:43.