用python下载大zip文件

用python下载大zip文件,python,download,urllib2,zipfile,Python,Download,Urllib2,Zipfile,我有多个返回zip文件的URL。我可以使用urllib2库下载大部分文件,如下所示: request = urllib2.urlopen(url) zip_file = request.read() 我遇到的问题是,其中一个文件大小为35Mb(压缩),我永远无法使用此库完成下载。我可以正常使用wget和浏览器下载它 我曾尝试在chuncks中下载该文件,如下所示: request = urllib2.urlopen(url) buffers = [] while True: buffe

我有多个返回zip文件的URL。我可以使用urllib2库下载大部分文件,如下所示:

request = urllib2.urlopen(url)
zip_file = request.read()
我遇到的问题是,其中一个文件大小为35Mb(压缩),我永远无法使用此库完成下载。我可以正常使用wget和浏览器下载它

我曾尝试在chuncks中下载该文件,如下所示:

request = urllib2.urlopen(url)
buffers = []
while True:
    buffer = request.read(8192)
    if buffer:
        buffers.append(buffer)
    else:
        break
final_file = ''.join(buffers)
但这也没有完成下载。不会引发错误,因此很难调试正在发生的事情。不幸的是,我不能在这里发布url/文件的示例


有什么建议吗?

这是从我的应用程序中复制/粘贴的,它下载自己的更新安装程序。它以块的形式读取文件,并立即将块保存在磁盘上的输出文件中

def DownloadThreadFunc(self):
    try:
        url = self.lines[1]
        data = None
        req = urllib2.Request(url, data, {})
        handle = urllib2.urlopen(req)

        self.size = int(handle.info()["Content-Length"])
        self.actualSize = 0
        name = path.join(DIR_UPDATES, url.split("/")[-1])
        blocksize = 64*1024

        fo = open(name, "wb")
        while not self.terminate:
            block = handle.read(blocksize)
            self.actualSize += len(block)
            if len(block) == 0:
                break
            fo.write(block)
        fo.close()
    except (urllib2.URLError, socket.timeout), e:
        try:
            fo.close()
        except:
            pass
        error("Download failed.", unicode(e))  

我使用
self.size
self.actualSize
在GUI线程中显示下载进度,如果需要,使用
self.terminate
从GUI按钮取消下载。

如果没有进一步的信息或复制它的URL,很难进行调试。但是,为什么不直接使用
final\u file=request.read()
?您上面的代码正在构建一个字符串数组,该数组将存储内存中的所有数据,因此我认为没有任何理由将代码复杂化,以便一次读取数据块。可能重复@benhoyt这是我第一次尝试,但没有成功。这就是为什么我试图将文件分割为可能的副本,与Masi建议的不同,但可能与@ChristopheD相同。至少,问题和建议的解决方案似乎非常接近——这非常有效!谢谢。但是你能告诉我为什么我的简化版本不起作用吗?不知道。但我有点怀疑这种构造:
如果缓冲区:
。我喜欢将块直接存储到磁盘上,这样也可以在输出文件上看到进度。我明白你的意思。我尝试了你的代码版本,也只将文件存储在内存中,效果也不错。这可能是我的初始缓冲区大小(太小)?我想可能是条件。你的代码什么时候会卡住?文件是否已下载到内存中?添加一些关于您已经下载了多少、数据大小等的调试打印输出。我使用的不是“if not block”,它工作正常。看起来是块太小了。这是唯一的区别。无论如何谢谢你!