python + urllib2:流传输提前结束

3 投票
2 回答
1576 浏览
提问于 2025-04-17 05:03

我正在尝试用Python处理一个从网上下载的大gzip文件,使用的是urllib2和zlib,还有这两个StackOverflow问题中的一些技巧:

这个方法效果很好,但在每次读取文件的一块后,我需要对得到的字符串进行一些操作,这些操作涉及很多分割和遍历。这会花费一些时间,当代码准备去执行下一个 req.read() 时,它什么都没返回,程序就结束了,只读取了第一块。

如果我把其他操作注释掉,整个文件就能被读取和解压。代码如下:

d = zlib.decompressobj(16+zlib.MAX_WBITS)
CHUNK = 16 * 1024
url = 'http://foo.bar/foo.gz'
req = urllib2.urlopen(url)
while True:
    chunk = req.read(CHUNK)
    if not chunk:
        print "DONE"
        break
    s = d.decompress(chunk)
    # ...
    # lots of operations with s
    # which might take a while
    # but not more than 1-2 seconds

有什么建议吗?

编辑:这其实是程序其他地方的一个错误,而不是urllib2/zlib处理的问题。感谢所有帮助过我的人。如果你需要处理大gzip文件,我可以推荐上面代码中使用的模式。

2 个回答

1

如果你的问题是因为超时,但你不太确定,那你可以把输入读取和处理的部分分开。可以在中间加一个队列,然后在另一个线程里处理这个队列里的数据。

你还可以把每次处理的数据块变小,这样每次循环处理的内容就会少一些。

1

这其实是程序其他地方的一个错误,并不是urllib2/zlib处理的问题。如果你需要处理大的gzip文件,我可以推荐上面代码中使用的那种方式。

撰写回答