2011-10-01 218 views
7

Excelファイルを処理するのにxlrdを使用しています。私は多くのファイルを含むフォルダ上のスクリプトを実行しており、ファイルに関連するメッセージを印刷しています。Python xlrd:警告メッセージを表示しない

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

このエラーメッセージを抑止する方法はありますので、CLIは唯一の私はそれをしたいメッセージを出力します。しかし、私は実行ファイルごとに、私は同様に、以下のxlrd、生成されたエラーメッセージが表示されますか?

答えて

8

xlrd docsの関連部分をチェックしてください。 open_workbook関数の2番目の引数はlogfileです。これは開いているファイルオブジェクトかact-に似ています。サポートする必要があるのは、writeメソッドです。デフォルトはsys.stdoutです。 @DaniloBargenで答えるように対応して

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 

更新

ので、このような何か(未テスト)は、仕事をする必要があります

それは個別に改行を書いています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には、この出力を生成する:

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

適切近代スクリプトが(代わりにステートメントの関数として印刷)2.6の同一の出力を生成し、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

。私が最初の行(それは空だった)を削除すると、警告は消えました。

関連する問題