【问题标题】:How to Ignore zlib errors at EOF?如何在 EOF 忽略 zlib 错误?
【发布时间】:2018-01-09 22:46:33
【问题描述】:

我需要我的 Python 脚本来操作 gzip 文件,这些文件可能仍会被写入。因为它们还没有被正确关闭,所以这样的操作有时会导致最后的 CRC 错误。

我怎样才能抑制这些错误并简单地处理直到不完整结尾的所有内容?

我的代码是:

if usegzip:
    opener = gzip.open;
else:
    opener = open;

...
for line in opener(input_filename,'r'):
    .... process line ....

遇到仍然打开的文件时遇到的异常是:

    for line in opener(input_filename,'r'):
  File "/opt/lib/python2.7/gzip.py", line 464, in readline
    c = self.read(readsize)
  File "/opt/lib/python2.7/gzip.py", line 268, in read
    self._read(readsize)
  File "/opt/lib/python2.7/gzip.py", line 315, in _read
    self._read_eof()
  File "/opt/lib/python2.7/gzip.py", line 354, in _read_eof
    hex(self.crc)))
IOError: CRC check failed 0x7248907 != 0x45e82dc4L

我可以在不重新实现gzip-module 的情况下以某种方式抑制它吗?

【问题讨论】:

  • 看看here
  • 谢谢。是的,是同样的错误,但是zlib-module 本身并没有提供适合直接替换的接口。没有zlib.open()和朋友...

标签: python python-2.7 gzip zlib


【解决方案1】:

好的,解决方案是放弃for-loop 的便利性并显式地遍历这些行。然后可以将显式迭代放入try/except 中以处理错误。例如,下面是 gzip 文件中的简单行数:

import gzip
import sys

f = sys.argv[-1]
count = 0
opener = gzip.open

lines = opener(f) # Creates the iterator normally used by for-loop

while 1:
    try:
        line = lines.next()
    except (IOError, StopIteration):
        break
    count += 1

print count

文件正常关闭后,上述脚本的输出与gzcat | wc -l的输出相同。但是,当文件仍然被写入时,脚本可以成功读取比gzcat更多的行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多