Python xlrd:抑制警告消息

Dav*_*542 8 python xlrd

xlrd用来处理Excel文件.我在包含许多文件的文件夹上运行脚本,我正在打印与文件相关的消息.但是,对于我运行的每个文件,我也会收到以下xlrd生成的错误消息:

WARNING *** OLE2 inconsistency: SSCS size is 0 but SSAT size is non-zero
Run Code Online (Sandbox Code Playgroud)

有没有办法抑制此错误消息,因此CLI将只打印我想要的消息?

Dan*_*gen 12

约翰的答案有效,但有一个小问题:

xlrd将该警告消息和以下换行符分别写入日志文件.因此,如果使用John提出的过滤器类,则将在stdout中获取空行而不是消息.您不应该简单地过滤掉日志输出中的所有换行符,因为可能存在"真实"警告,然后会丢失换行符.

如果你想简单地忽略xlrd的所有日志输出,这可能是最简单的解决方案:

book = xlrd.open_workbook("foo.xls", logfile=open(os.devnull, 'w'))
Run Code Online (Sandbox Code Playgroud)


Joh*_*hin 9

查看xlrd文档的相关部分.open_workbook函数的第二个arg 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
Run Code Online (Sandbox Code Playgroud)

响应@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
Run Code Online (Sandbox Code Playgroud)

为所有Pythons 2.2到2.7生成此输出,包括:

'foo'
'\n'
'bar'
'\n'
'baz'
'\n'
Run Code Online (Sandbox Code Playgroud)

适当的现代化脚本(作为函数而不是语句打印)产生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()
Run Code Online (Sandbox Code Playgroud)