2011-10-01 2391 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

對於什麼是值得我有同樣的警告信息;當我刪除第一行(這是空的)時,警告消失了。