체크 아웃 xlrd docs의 관련 부분. open_workbook
함수의 두 번째 인수는 열린 파일 객체 또는 act-all이어야하는 logfile
입니다. 지원해야하는 것은 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
문장/기능. 이 스크립트 2.7 2.6
'foo'
'\n'
'bar'
'\n'
'baz'
'\n'
적합하게 현대화 스크립트 (대신 성명의 함수로서 프린트) 생성 동일한 출력 :
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 이하로 모든 파이톤이 출력을 생성 , 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