2011-10-01 91 views
7

我使用xlrd来处理Excel文件。我在包含许多文件的文件夹上运行脚本,并且正在打印与这些文件相关的消息。然而,对于每一个我运行文件,我得到以下xlrd产生的错误信息,以及:Python xlrd:取消警告消息

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

有没有办法抑制这种错误信息,所以CLI将只打印我希望它的消息?

回答

8

退房的xlrd docs的相关部分。 open_workbook函数的第二个参数是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 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 

更新响应由@DaniloBargen回答:

这不是xlrd那我们分别写换行符,它的Python print声明/函数。此脚本:

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

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

产生这样的输出为所有蟒2.2〜2.7(包括端点):为2.6

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

甲适当现代化脚本(打印为函数而不是一个语句)产生相同的输出,2.7 ,3.1,3.2和3.3。你可以用更复杂的过滤器类来解决这个问题。下面的例子还允许短语的序列进行检查:

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

感谢您提供更具体和详细的​​答案。我相应地授予你的答案。 – David542

10

约翰答案的工作,但有一个小问题:

xlrd写道,报警信息,并且可以分为以下换行符给日志文件。因此,如果使用John提出的过滤器类,则会在标准输出中获得一个空行而不是消息。不过,您不应该简单地从日志输出中过滤出所有换行符,因为可能会有“真实”的警告,然后会错过换行符。

如果你想简单地忽略xlrd所有日志输出,这可能是最简单的解决方案:

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

好皮卡!看到我相当广泛的答案。 –

0

对于什么是值得我有同样的警告信息;当我删除第一行(这是空的)时,警告消失了。