我正在尝试使用Python 2从服务器下载大文件:
req = urllib2.Request("https://myserver/mylargefile.gz")
rsp = urllib2.urlopen(req)
data = rsp.read()
服务器使用“Transfer-Encoding:chunked”发送数据,而我只获得一些二进制数据,这些数据无法通过gunzip解压缩。
我必须迭代多个read()吗?还是多个请求?如果是这样,他们怎么样?
注意:我正在尝试仅使用Python 2标准库来解决问题,而不需要其他库,例如urllib3或请求。这甚至可能吗?
答案 0 :(得分:1)
如果我没弄错的话,以下内容对我有用 - 前一段时间:
data = ''
chunk = rsp.read()
while chunk:
data += chunk
chunk = rsp.read()
每个read
读取一个块 - 所以继续阅读,直到没有更多的东西到来。
尚未准备好支持此文件的文件......
答案 1 :(得分:0)
来自urllib2.urlopen上的python文档:
一个警告:read()方法,如果省略size参数或 否定,直到数据流结束才可能读取;没有 确定来自套接字的整个流的好方法 在一般情况下阅读。
所以,循环读取数据:
req = urllib2.Request("https://myserver/mylargefile.gz")
rsp = urllib2.urlopen(req)
data = rsp.read(8192)
while data:
# .. Do Something ..
data = rsp.read(8192)
答案 2 :(得分:0)
我有同样的问题。
我发现“传输编码:分块”通常与“内容编码: gzip”。
所以也许我们可以获得压缩的内容并解压缩。
对我有用。
import urllib2
from StringIO import StringIO
import gzip
req = urllib2.Request(url)
req.add_header('Accept-encoding', 'gzip, deflate')
rsp = urllib2.urlopen(req)
if rsp.info().get('Content-Encoding') == 'gzip':
buf = StringIO(rsp.read())
f = gzip.GzipFile(fileobj=buf)
data = f.read()