2011-10-01 7 views
7

xlrd을 사용하여 Excel 파일을 처리하고 있습니다. 많은 파일이 들어있는 폴더에서 스크립트를 실행하고 있으며 파일과 관련된 메시지를 인쇄하고 있습니다.Python xlrd : 경고 메시지를 표시하지 않음

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

이 오류 메시지를 표시 할 수있는 방법이 있나요 때문에 CLI 단지 내가 그것을 할 메시지를 출력 할 것이다 : 그러나, 실행하는 각 파일에 대해, 나뿐만 아니라 다음과 같은 xlrd 생성 된 오류 메시지가?

답변

8

체크 아웃 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() 
+0

좀 더 구체적이고 자세한 답변을 해주셔서 감사합니다. 나는 그에 따라 당신의 대답을 얻었습니다. – David542

10
요한 대답은 작동하지만, 작은 문제가

:

xlrd가 있음을 기록을 경고 메시지와 별도로 다음과 같은 개행 문자 로그 파일. 따라서 John이 제안한 필터 클래스를 사용하는 경우 메시지 대신 표준 출력에 빈 줄이 표시됩니다. new 출력을위한 모든 newline을 단순히 필터링해서는 안된다. 왜냐하면 "진짜"경고가 나오기 때문에 줄 바꿈이 누락 될 수 있기 때문이다.

단순히 xlrd 모든 로그 출력을 무시하려면이 아마 가장 간단한 솔루션입니다 :

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

좋은 픽업! 내 확장 된 답변을 참조하십시오. –

0

그것이 내가 같은 경고 메시지가 있었다 가치가 무엇인지에 대한; 첫 번째 행 (비어 있음)을 삭제하면 경고가 사라졌습니다.

관련 문제