我使用xlrd
来处理Excel文件。我在包含许多文件的文件夹上运行脚本,并且正在打印与这些文件相关的消息。然而,对于每一个我运行文件,我得到以下xlrd产生的错误信息,以及:Python xlrd:取消警告消息
WARNING *** OLE2 inconsistency: SSCS size is 0 but SSAT size is non-zero
有没有办法抑制这种错误信息,所以CLI将只打印我希望它的消息?
我使用xlrd
来处理Excel文件。我在包含许多文件的文件夹上运行脚本,并且正在打印与这些文件相关的消息。然而,对于每一个我运行文件,我得到以下xlrd产生的错误信息,以及:Python xlrd:取消警告消息
WARNING *** OLE2 inconsistency: SSCS size is 0 but SSAT size is non-zero
有没有办法抑制这种错误信息,所以CLI将只打印我希望它的消息?
退房的xlrd docs的相关部分。 open_workbook
函数的第二个参数是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
更新响应由@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
产生这样的输出为所有蟒2.2〜2.7(包括端点):为2.6
'foo'
'\n'
'bar'
'\n'
'baz'
'\n'
甲适当现代化脚本(打印为函数而不是一个语句)产生相同的输出,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()
import warnings
def fxn():
warnings.warn("deprecated", DeprecationWarning)
with warnings.catch_warnings():
warnings.simplefilter("ignore")
fxn()
- >http://docs.python.org/library/warnings.html#temporarily-suppressing-warnings
-1警告模块的警告与OP的问题无关。看到我的答案。 –
约翰答案的工作,但有一个小问题:
xlrd写道,报警信息,并且可以分为以下换行符给日志文件。因此,如果使用John提出的过滤器类,则会在标准输出中获得一个空行而不是消息。不过,您不应该简单地从日志输出中过滤出所有换行符,因为可能会有“真实”的警告,然后会错过换行符。
如果你想简单地忽略xlrd所有日志输出,这可能是最简单的解决方案:
book = xlrd.open_workbook("foo.xls", logfile=open(os.devnull, 'w'))
好皮卡!看到我相当广泛的答案。 –
对于什么是值得我有同样的警告信息;当我删除第一行(这是空的)时,警告消失了。
感谢您提供更具体和详细的答案。我相应地授予你的答案。 – David542