我正在尝试使用以下代码下载zip文件:
o = urllib2.build_opener( urllib2.HTTPCookieProcessor() )
#login
p = urllib.urlencode( { usernameField: usernameVal, passField: passVal } )
f = o.open(authUrl, p )
data = f.read()
print data
f.close()
#download file
f = o.open(remoteFileUrl)
localFile = open(localFile, "wb")
localFile.write(f.read())
f.close()
我收到了一些二进制数据,但文件大小太小而且不是有效的zip文件 . 我没有正确检索zip文件吗? f = o.open(remoteFileUrl)
的HTTP响应头如下所示 . 我不知道是否需要特殊处理来处理这个响应:
HTTP / 1.1 200 OK服务器:Apache-Coyote / 1.1 Pragma:私有缓存控制:必须重新验证过期:星期二,1997年12月31日23:59:59 GMT内容 - 处置:内联;文件名= “files.zip”;内容类型:application / zip Transfer-Encoding:chunked
4 回答
f.read()
不是't necessarily read the whole file, but just a packet of it (which might be the whole file if it'小,但不适用于大文件) .你需要像这样循环数据包:
f.read()
返回一个空包,表示您已读取整个文件 .如果你不介意将整个zip文件读入内存,最快的读写方式如下:
否则,当您通过网络获取时,要以块的形式进行读写,请执行此操作
这有点不太整洁,但避免将整个文件保存在内存中 . 希望能帮助到你 .
这是一个更强大的解决方案,使用urllib2以块的形式下载文件并打印下载状态
试试这个: