我想下载一个压缩文件(gzip或bzip2格式),解压并分析其内容(它是一个类似CSV的文件,包含大量数据,我要对某些列进行求和、平均值等计算),同时在下载过程中进行(以便我可以在下载完成前显示部分结果)。该文件非常大(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模块更糟糕——它根本不允许传递文件对象。
经过寻找答案,我发现这个问题。答案的解决方法基本上是将整个压缩文件存储在内存中,而这对我来说是不可行的。
我该怎么办?