【问题标题】:Python: How to handle a corrupted gzip file in reading multiple filesPython:如何在读取多个文件时处理损坏的 gzip 文件
【发布时间】:2020-08-15 01:12:20
【问题描述】:

我正在阅读大量 gzip 文件。当我尝试以下代码时,由于某些文件已损坏,该过程无法完成。 Python 可以打开这些损坏的文件,但由于这些文件中某些行的错误,该过程会中断。

    for file in files:
        try:
            fin=gzip.open(file,'rb')
        except:
            continue
        
        for line in fin:
            try:
                temp=line.decode().split(",")
                a,b,c,d=temp[0],int(temp[1]),int(temp[2]),int(temp[3])
            except:
                continue

但是由于以下错误,程序停止了。 处理损坏的gzip 文件的最佳方法是什么?

Traceback (most recent call last):---------------------------| 9.0% Complete
  File "/opt/anaconda3/lib/python3.7/gzip.py", line 374, in readline
    return self._buffer.readline(size)
  File "/opt/anaconda3/lib/python3.7/_compression.py", line 68, in readinto
    data = self.read(len(byte_view))
  File "/opt/anaconda3/lib/python3.7/gzip.py", line 463, in read
    if not self._read_gzip_header():
  File "/opt/anaconda3/lib/python3.7/gzip.py", line 411, in _read_gzip_header
    raise OSError('Not a gzipped file (%r)' % magic)
OSError: Not a gzipped file (b'rv')

我已将代码修改如下,看起来运行良好,但不确定这是否是处理此类情况的最佳方法。 因为在某些情况下,程序似乎没有终止(我需要测试更多)。

    for file in files:
        try:
            fin=gzip.open(file,'rb')
        except:
            continue
        
        line=True
        while line:
            try:
                line=fin.readline()
            except:
                continue
            try:
                temp=line.decode().split(",")
                a,b,c,d=temp[0],int(temp[1]),int(temp[2]),int(temp[3])
            except:
                continue

【问题讨论】:

  • 您至少可以使用except Exception as ex: print(ex) 来查看何时出现问题。您还可以计算异常并在 ie 之后退出此循环。 3 个例外。
  • 这个问题似乎与读取损坏的 gzip 文件无关。您似乎在问如何读取多个文件并优雅地处理损坏的 gzip 文件。您能否编辑您的标题以反映这一点?

标签: python file gzip readline


【解决方案1】:

您对文件的迭代超出了任何try...except,因此此处引发的异常将终止程序。如果你有一次尝试......除了整个事情,那么它应该可以工作:

    for file in files:
        try:
            with gzip.open(file,'rb') as fin:
                for line in fin:
                    temp = line.decode().split(",")
                    a,b,c,d = temp[0], int(temp[1]), int(temp[2]), int(temp[3])
        except OSError, ValueError:
            continue

另请注意:

  • 仅捕获我们预计会因错误文件而发生的特定异常,而不是仍应终止程序的其他事物(例如KeyboardInterrupt)。裸露的except: 通常是个坏主意。
  • 最好使用带有gzip.openwith 构造

【讨论】:

    【解决方案2】:

    我已将文件处理部分拆分为一个单独的函数,以便在处理每个文件期间处理异常情况。

    def proc_file(file):
        try:
            fin=gzip.open(file,'rb')
        except:
            return
            
        err_cnt=0
    
        while err_cnt<10:
            try:
                line=fin.readline()
            except:
                err_cnt+=1
                continue
            if not line:
                err_cnt+=1
                continue
            try:
                temp=line.decode().split(",")
                a,b,c,d=temp[0],int(temp[1]),int(temp[2]),int(temp[3])
            except:
                continue
        return processed_value
    
    for file in files:
    
        result=[]
        try:
            value=proc_file(file)
        except:
            continue
        
        result.append(value)
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-08
      • 2020-11-21
      相关资源
      最近更新 更多