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()
より具体的かつ詳細な回答をいただきありがとうございます。私はそれに応じてあなたの答えを授けました。 – David542