查看xlrd文档的相关部分。
open_workbook函数的第二个arg
logfile应该是一个打开的文件对象或类似行为。它所需要支持的只是一种
write方法。默认为
sys.stdout。
因此,应执行以下操作(未测试):
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 uplog = open("the_log_file.txt", "w")log_filter = MyFilter(log)book = xlrd.open_workbook("foo.xls", logfile=log_filter)# shut downlog.close()# or use a "with" statement更新 以回复@DaniloBargen的回答:
不是
xlrd单独编写换行符,而是Python
class FakeFile(object): def write(self, data): print repr(data)ff = FakeFile()for x in "foo bar baz".split(): print >> ff, x
为所有Python 2.2至2.7(包括以下两个)生成此输出:
'foo''n''bar''n''baz''n'
适当现代化的脚本(作为功能而不是语句打印)对于2.6、2.7、3.1、3.2和3.3产生相同的输出。您可以使用更复杂的过滤器类来解决此问题。以下示例另外允许检查短语序列:
import sys, glob, xlrdclass 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 = 0logf = 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()


