处理gzip压缩或bzip2ed下载而不保留压缩数据

时间:2013-03-22 17:48:54

标签: python gzip urllib2 bzip2

我想下载一个压缩文件(在gzip或bzip2中),解压缩并分析其内容(它是一个包含大量数据的类似CSV的文件,我计算某些列的总和,平均值等)< em> while 下载发生(这样我可以在下载结束前显示部分结果)。文件很大(4GB),解压缩的流甚至更大,所以我不想将整个压缩文件保存在磁盘或内存中。

我认为可以将python的gzip或bz2实现与urllib2结合使用:

data_stream = csv.reader(
                  gzip.GzipFile(
                      fileobj=urllib2.urlopen('http://…/somefile.gz')),
                  delimiter='\t')

...但似乎urlopen的文件对于GzipFile来说不够文件。尝试从这样的流中读取后,我得到了一个追溯:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/gzip.py", line 450, in readline
    c = self.read(readsize)
  File "/usr/lib/python2.7/gzip.py", line 256, in read
    self._read(readsize)
  File "/usr/lib/python2.7/gzip.py", line 283, in _read
    pos = self.fileobj.tell()   # Save current position
AttributeError: addinfourl instance has no attribute 'tell'

BZ2模块更糟糕 - 它根本不允许传递文件对象。

在寻找答案之后,我找到了this question。答案通常基本上将整个压缩文件存储在内存中,这对我来说是不可行的。

我该怎么办?

1 个答案:

答案 0 :(得分:3)

使用zlib in pythonzlib.decompressobj将创建一个可以逐步提供gzip压缩数据的对象,并使用对象上的decompress方法吐出可用的未压缩数据。您需要将wbits设置为31才能解码gzip格式。 15将解码zlib格式。