我想下载一个压缩文件(在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。答案通常基本上将整个压缩文件存储在内存中,这对我来说是不可行的。
我该怎么办?
答案 0 :(得分:3)
使用zlib in python。 zlib.decompressobj
将创建一个可以逐步提供gzip压缩数据的对象,并使用对象上的decompress
方法吐出可用的未压缩数据。您需要将wbits
设置为31才能解码gzip格式。 15将解码zlib格式。