2011-10-01 38 views
7

Estoy usando xlrd para procesar archivos de Excel. Estoy ejecutando un script en una carpeta que contiene muchos archivos, y estoy imprimiendo mensajes relacionados con los archivos. Sin embargo, para cada archivo corro, me sale el siguiente mensaje de error XLRD-generados, así:Python xlrd: suprimir mensajes de advertencia

WARNING *** OLE2 inconsistency: SSCS size is 0 but SSAT size is non-zero 

¿Hay una manera de suprimir este mensaje de error, por lo que la CLI sólo se imprimirá el mensaje que deseo?

Respuesta

8

Mira la parte pertinente de la xlrd docs. El segundo arg de la función open_workbook es logfile que debe ser un objeto de archivo abierto o similar. Todo lo que necesita para admitir es un método write. Por defecto es sys.stdout.

Por lo tanto, algo como esto (no probado) debe hacer el trabajo:

class MyFilter(object): 
    def __init__(self, mylogfile=sys.stdout): 
     self.f = mylogfile 
    def write(self, data): 
     if "WARNING *** OLE2 inconsistency" not in data: 
      self.f.write(data) 

#start up 
log = open("the_log_file.txt", "w") 
log_filter = MyFilter(log) 
book = xlrd.open_workbook("foo.xls", logfile=log_filter) 

# shut down 
log.close() 
# or use a "with" statement 

actualización en respuesta a responder por @DaniloBargen:

No es xlrd que está escribiendo la nueva línea por separado, es el Python print declaración/función. Esta secuencia de comandos:

class FakeFile(object): 
    def write(self, data): 
     print repr(data) 

ff = FakeFile() 
for x in "foo bar baz".split(): 
    print >> ff, x 

produce esta salida para todos los pitones 2.2 a 2.7, ambos inclusive:

'foo' 
'\n' 
'bar' 
'\n' 
'baz' 
'\n' 

Un script adecuadamente modernizado (imprimir como una función en lugar de una declaración) produce una salida idéntica para 2.6, 2.7 , 3.1, 3.2 y 3.3. Puede solucionar esto con una clase de filtro más complicada. El siguiente ejemplo permite además una secuencia de frases para comprobar:

import sys, glob, xlrd 

class MyFilter(object): 
    def __init__(self, mylogfile=sys.stdout, skip_list=()): 
     self.f = mylogfile 
     self.state = 0 
     self.skip_list = skip_list 
    def write(self, data): 
     if self.state == 0: 
      found = any(x in data for x in self.skip_list) 
      if not found: 
       self.f.write(data) 
       return 
      if data[-1] != '\n': 
       self.state = 1 
     else: 
      if data != '\n': 
       self.f.write(data) 
      self.state = 0 

logf = open("the_log_file.txt", "w") 
skip_these = (
    "WARNING *** OLE2 inconsistency", 
    ) 
try:   
    log_filter = MyFilter(logf, skip_these) 
    for fname in glob.glob(sys.argv[1]): 
     logf.write("=== %s ===\n" % fname) 
     book = xlrd.open_workbook(fname, logfile=log_filter) 
finally: 
    logf.close() 
+0

Gracias por la respuesta más específica y detallada. En consecuencia he otorgado tu respuesta. – David542

10

La respuesta de John funciona, pero tiene un pequeño problema:

XLRD escribe que el mensaje de advertencia y el siguiente carácter de nueva línea por separado a la archivo de registro. Por lo tanto, obtendrá una línea vacía en su stdout en lugar del mensaje, si usa la clase de filtro propuesta por John. Sin embargo, no debería simplemente filtrar todas las nuevas líneas de la salida de registro, ya que podría haber advertencias "reales" que luego perderían las nuevas líneas.

Si desea ignorar todas las salidas de registro por XLRD, esta es probablemente la solución más simple:

book = xlrd.open_workbook("foo.xls", logfile=open(os.devnull, 'w')) 
+0

¡Buena recogida! Ver mi respuesta considerablemente expandida. –

0

Por lo que vale la pena que tenía el mismo mensaje de advertencia; cuando borré la primera fila (que estaba vacía) la advertencia desapareció.

Cuestiones relacionadas