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()
Gracias por la respuesta más específica y detallada. En consecuencia he otorgado tu respuesta. – David542