Advertisement
Guest User

ErrorZip Procesing

a guest
Jan 24th, 2012
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 9.58 KB | None | 0 0
  1. # -*- coding: utf-8 -*-#
  2. #!/usr/bin/env python
  3. from compiler.ast import TryFinally
  4.  
  5. __author__ = 'Mario Lacunza <mlacunza@gmail.com>'
  6. __version__ = '0.9.0'
  7.  
  8.  
  9. import wx
  10. import forms
  11. import oDatabase
  12. import os
  13. import sys
  14. import zipfile
  15. import shutil
  16. import csv
  17. import string
  18.  
  19. # Implementing frmMain
  20. class tlstadfrmMain(forms.frmMain):
  21.     def __init__(self, parent):
  22.         forms.frmMain.__init__(self, parent)
  23.        
  24.         #Establece el tipo de OS
  25.         self.OS = os.name
  26.        
  27.         #Carga los archivos en el path actual
  28.         self.files = os.listdir('.')
  29.        
  30.         #Obtener path actual
  31.         self.path = os.getcwd()
  32.         self.dirMain.SetDefaultPath(self.path)
  33.        
  34.         #Se necesita esto para la version Windows
  35.         if self.OS == 'nt':
  36.             self.dirMain.ReCreateTree()
  37.        
  38.         self.fol = None
  39.        
  40.         #Crea estructura de folders
  41.         self.crearFoldersBase()
  42.        
  43.         #Crea el log
  44.         self.cLog = MyLog(self.txtLog)
  45.         self.cLog.DoLogString('Application start...')
  46.  
  47.    
  48.     # Handlers for frmMain events.
  49.     def dirMainOnTreeSelChanged(self, event):
  50.        
  51.         #Esto para cuando se Procesa
  52.         item = self.dirMain.GetFilePath()
  53.         ext = self.getFileExtension(item)
  54.         if ext == '.zip':
  55.             self.ZipFile = item
  56.            
  57.         #Para cuando WIPO
  58.         self.fol = self.dirMain.GetPath()
  59.        
  60.    
  61.     def dirMainOnTreeItemActivated( self, event ):
  62.         # TODO: Implement dirMainOnTreeItemActivated
  63.         pass
  64.        
  65.     def dirMainOnTreeItemRightClick( self, event ):
  66.         #self.creaMnuDer()
  67.         pass
  68.        
  69.     def tProcesoOnToolClicked( self, event ):
  70.         self.Procesar()
  71.    
  72.    
  73.     def tZipOnToolClicked( self, event ):
  74.         self.CrearWipo()
  75.    
  76.     def tSalirOnToolClicked( self, event ):
  77.         self.Salir()
  78.    
  79.     def trefreshOnToolClicked( self, event ):
  80.         self.dirMain.ReCreateTree()
  81.        
  82. #-------------------------------------------------------------------------------
  83. #-------------------------------------------------------------------------------
  84.    
  85.     def Salir(self):
  86.         self.Destroy()
  87.  
  88. #-------------------------------------------------------------------------------       
  89.     def dbConnet(self, icode):
  90.        
  91.         self.db = oDatabase.BaseDatos()
  92.         self.db.connect()
  93.        
  94.         qry = "Select * from codes where IPC = ?"
  95.         val = (icode,)
  96.         rs = self.db.excecute(qry, val)
  97.        
  98.         return rs
  99.  
  100. #------------------------------------------------------------------------------
  101.  
  102.     def CrearWipo(self):
  103.         "Crea la Wipo estructura despues que user ha trabajado files."
  104.  
  105.         #Valida que user halla seleccionado un folder
  106.         if self.fol == None:
  107.             dlg = wx.MessageDialog(self, 'You need select the folder cantaining the files to be processed!',
  108.                                    'WIPO Process', wx.OK | wx.ICON_INFORMATION)
  109.             dlg.ShowModal()
  110.             dlg.Destroy()
  111.            
  112.         else:
  113.             wipofolder = self.fol
  114.        
  115.             #Pregunta al user por el nombre del nuevo WIPO ZIP
  116.             dlg2 = wx.TextEntryDialog(self, 'Write the New WIPO Zip name [Add ONLY de name not ZIP extension]','WIPO Process')
  117.    
  118.             if dlg2.ShowModal() == wx.ID_OK:
  119.                 wipozip_name = dlg2.GetValue()
  120.    
  121.             dlg2.Destroy()
  122.            
  123.             try:
  124.                
  125.                 self.cLog.DoLogString("Start Creating Wipo...")
  126.                 fzip = self.path + "/files/final/" + wipozip_name + ".zip"
  127.                
  128.                 zf = zipfile.ZipFile(fzip, mode='w', compression = zipfile.ZIP_DEFLATED)
  129.                 zf.close()
  130.                
  131.                 nivel = 0
  132.                 zfi = None
  133.                 oldzip = []
  134.                
  135.                 for path, dirs, files in os.walk(wipofolder):
  136.                     #Obtiene nombre, verifica si tiene word crea un folder                 
  137.                     print "Path: " + path
  138.                    
  139.                     if string.find(path,'word') > -1:
  140.                         fname = os.path.basename(path) + '.zip'
  141.                         comname = self.path + "/files/final/" + fname
  142.                        
  143.                         if comname not in oldzip:
  144.                             zfi = zipfile.ZipFile(comname, mode='w', compression = zipfile.ZIP_DEFLATED)
  145.                             zf.close()
  146.                             oldzip.append((comname,fname))
  147.                        
  148.                     for f in files:
  149.                         ff = os.path.join(path, f)
  150.                         print ff
  151.                         nivel += 1
  152.                         print nivel
  153.                        
  154.                         if self.getFileExtension(f) == '.csv':
  155.                             zf = zipfile.ZipFile(fzip, mode='a')
  156.                             zf.write(ff,f)
  157.                             zf.close()
  158.                            
  159.                         elif self.getFileExtension(f) == '.rtf':
  160.                             zf = zipfile.ZipFile(fzip, mode='a')
  161.                             zf.write(ff,f)
  162.                             zf.close()
  163.                        
  164.                         elif self.getFileExtension(f) == '.tif':
  165.                             if string.find(path,'word') > -1:
  166.                                 zfi = zipfile.ZipFile(comname, mode='a')
  167.                                 zfi.write(ff,f)
  168.                                 zfi.close()
  169.  
  170.                 for item in oldzip:
  171.                     zf = zipfile.ZipFile(fzip, mode='a')
  172.                     zf.write(item[0], item[1])
  173.                     zf.close()
  174.                    
  175.                     os.remove(item[0])
  176.                    
  177.                            
  178.             except:
  179.                 #self.cLog.DoLogString("System Error:" + sys.exc_info()[0])
  180.                 print "System Error:", sys.exc_info()[0]
  181.                 raise
  182.  
  183.  
  184. #------------------------------------------------------------------------------
  185.  
  186.     def Procesar(self):
  187.         """Procesa el ZIP file. Extrae todos los files del zip."""
  188.        
  189.         #Nombre del temp folder donde se hace unzip
  190.         tmp_foldername = None
  191.        
  192.         #Obtengo el nombre del zip+extension
  193.         f=len(self.path)+11
  194.         tmp_foldername = self.ZipFile[f:-4]
  195.                
  196.         #Path work folder tmp
  197.         tmp_workfolder= self.path + '/files/tmp/'+ tmp_foldername
  198.         #Path pre folder
  199.         tmp_pre = self.path + '/files/pre/'+ tmp_foldername
  200.        
  201.         #Sino esta creado el dir lo crea
  202.         if not os.path.exists(tmp_workfolder):
  203.             os.makedirs(tmp_workfolder)
  204.        
  205.         zf = zipfile.ZipFile(self.ZipFile, mode='r')
  206.  
  207.         self.cLog.DoLogString('Start process...')
  208.         #Recorre el Zip file abriendo y grabando los files
  209.         for filezipped in zf.infolist():
  210.             filename = filezipped.filename
  211.             data = zf.read(filename)
  212.                
  213.             fout = open(filename, "w")
  214.             fout.write(data)
  215.             fout.close()
  216.            
  217.             #Mueve el file del root al destino
  218.             shutil.move(filename, tmp_workfolder)
  219.            
  220.             #Mensaje en el log
  221.             self.cLog.DoLogString('Woking in tmp folder...')
  222.             txt = "New file created --> %s" % filename
  223.             self.cLog.DoLogString(txt)
  224.            
  225.         #Crea nuevo directorio de trabajo en /files/pre
  226.         if not os.path.exists(tmp_pre):
  227.             os.makedirs(tmp_pre)
  228.        
  229.         #Busca File CSV para usar codigos IPC se lee todo el csv y se le
  230.         #copia en una lista, porque mientras esta siendo leido es borrado
  231.         #y copiado en memoria, origina error de lectura
  232.         csvfile = self.BuscarCSV(tmp_workfolder)
  233.         csvinfo = self.ReadCSV(csvfile)
  234.        
  235.         self.cLog.DoLogString('Processing Zips...')
  236.         #Recorre el folder para procesar archivos
  237.         for subdir, dirs, files in os.walk(tmp_workfolder):
  238.             for f in files:
  239.                 #Crea folders
  240.                 ext = self.getFileExtension(f)
  241.                
  242.                 if not ext=='.csv':
  243.                     cod = f[3:15]
  244.                     cod = cod.upper()
  245.                     rs = self.ObtenerIPC(csvinfo, cod)
  246.                     rcod = rs[0][1]
  247.                     fname = tmp_pre + '/' + cod + '-' + rcod
  248.                    
  249.                     if not os.path.exists(fname):
  250.                         os.makedirs(fname)
  251.                
  252.                 ff = tmp_workfolder + '/' + f
  253.                
  254.                 #Detecta extension y procesa
  255.                 ext2 = self.getFileExtension(ff)
  256.                
  257.                 if ext =='.csv':
  258.                     shutil.move(ff, tmp_pre)
  259.                 elif ext == '.rtf':
  260.                     shutil.move(ff, fname)
  261.                 elif ext == '.zip':
  262.                     #Recorre el Zip file abriendo y grabando los files
  263.                     zff = zipfile.ZipFile(ff, mode='r')
  264.                     for filezipped in zff.infolist():
  265.                         filename2 = filezipped.filename
  266.                         data2 = zff.read(filename2)
  267.                            
  268.                         fout2 = open(filename2, "w")
  269.                         fout2.write(data2)
  270.                         fout2.close()
  271.                        
  272.                         folder = fname + '/' + f[:-4]
  273.                         if not os.path.exists(folder):
  274.                             os.makedirs(folder)
  275.                        
  276.                         shutil.move(filename2, folder)
  277.        
  278.         #Borra el directorio tmp
  279.         self.cLog.DoLogString('Clean tasks...')
  280.         shutil.rmtree(tmp_workfolder)
  281.        
  282.         self.cLog.DoLogString('End process...')
  283.  
  284. #-------------------------------------------------------------------------------
  285.     def ReadCSV(self, csvfile):
  286.         """Obtiene codigos IPC de la base de datos."""
  287.         reader = csv.reader(open(csvfile,'rb'))
  288.         rs = []
  289.        
  290.         for index, row in enumerate(reader):
  291.             rs.append(row)
  292.            
  293.         return rs
  294.    
  295. #-------------------------------------------------------------------------------
  296.     def ObtenerIPC(self, csvinfo, code):
  297.         """Busca Codigo IPC."""
  298.         for row in csvinfo:
  299.             if row[0] == code:
  300.                 ipc = row[2]
  301.                 ipc = ipc[0:3]
  302.                 rs = self.dbConnet(ipc)
  303.                 return rs
  304.  
  305. #------------------------------------------------------------------------------
  306.     def BuscarCSV(self, mpath):
  307.         """Obtiene el CSV file dento de path."""
  308.        
  309.         for r,d,f in os.walk(mpath):
  310.             for files in f:
  311.                 if files.endswith(".csv"):
  312.                     csv = os.path.join(r,files)
  313.                     return csv
  314.        
  315. #------------------------------------------------------------------------------
  316.  
  317.  
  318.     def crearFoldersBase(self):
  319.         """Crea la estructura de folders basica para la app.
  320.        
  321.         Se ejecuta solo una vez."""
  322.  
  323.         if not os.path.exists('files'):
  324.         #Establece los folders segun el OS
  325.             if self.OS == 'posix':
  326.                 os.makedirs('files')
  327.                 os.makedirs('files/tmp')
  328.                 os.makedirs('files/pre')
  329.                 os.makedirs('files/final')
  330.                
  331.             elif self.OS == 'nt':
  332.                 os.makedirs('files')
  333.                 os.makedirs('files\tmp')
  334.                 os.makedirs('files\pre')
  335.                 os.makedirs('files\final')
  336.            
  337. #------------------------------------------------------------------------------
  338.  
  339.     def getFileExtension(self, filename):
  340.         """Helper function for getting a file's extension"""
  341.         # check if directory
  342.         if not os.path.isdir(filename):
  343.             # search for the last period
  344.             index = filename.rfind('.')
  345.             if index > -1:
  346.                 return filename[index:]
  347.             return ''
  348.         else:
  349.             return 'directory'
  350.        
  351. #------------------------------------------------------------------------------
  352. class MyLog(wx.PyLog):
  353.     def __init__(self, textCtrl):
  354.         wx.PyLog.__init__(self)
  355.         self.tc = textCtrl
  356.  
  357.     def DoLogString(self, message):
  358.         if self.tc:
  359.             self.tc.AppendText(message + '\n')
  360. #------------------------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement