Python xlrd:禁止显示警告消息

发布于 2021-01-29 15:58:25

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

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

有没有一种方法可以禁止显示此错误消息,因此CLI只会打印我想要的消息?

关注者
0
被浏览
141
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    查看xlrd文档的相关部分。open_workbook函数的第二个arglogfile应该是一个打开的文件对象或类似行为。它所需要支持的只是一种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
    

    更新 以回复@DaniloBargen的回答:

    不是xlrd单独编写换行符,而是Pythonprint语句/函数。该脚本:

    class FakeFile(object):
        def write(self, data):
            print repr(data)
    
    ff = FakeFile()
    for x in "foo bar baz".split():
        print >> ff, x
    

    为所有Python 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()
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看