如何使用httplib2下载大文件

时间:2015-02-16 12:25:35

标签: python httplib2

是否可以使用httplib2以块的形式下载大文件。我正在从Google API下载文件,为了使用Google OAuth2WebServerFlow中的凭据,我必然会使用httplib2。

我正在做的那一刻:

flow = OAuth2WebServerFlow(
    client_id=XXXX,
    client_secret=XXXX,
    scope=XYZ,
    redirect_uri=XYZ
)

credentials = flow.step2_exchange(oauth_code)

http = httplib2.Http()
http = credentials.authorize(http)

resp, content = self.http.request(url, "GET")
with open(file_name, 'wb') as fw:
    fw.write(content)

但是content变量可以超过500MB。

以块的形式阅读响应的任何方式?

3 个答案:

答案 0 :(得分:0)

您可以考虑streaming_httplib2,httplib2的一个分支,其行为完全正确。

  

为了使用Google OAuth2WebServerFlow中的凭据,我必然会使用httplib2。

如果您需要httplib2中没有的功能,那么值得查看让您的凭据处理与另一个HTTP库一起工作的工作量。这可能是一项很好的长期投资。 (例如How to download large file in python with requests.py?。)

答案 1 :(得分:0)

关于以块的形式阅读响应(与httplib一起使用,必须与httplib2一起使用)

import httplib
conn = httplib.HTTPConnection("google.com")
conn.request("GET", "/")
r1 = conn.getresponse()

try:
    print r1.fp.next()
    print r1.fp.next()
except:
    print "Exception handled!"

注意:next()可能会引发StopIteration异常,您需要处理它。

您可以避免像这样调用next()

F=open("file.html","w")
for n in r1.fp:
    F.write(n)
    F.flush()

答案 2 :(得分:0)

您可以将oauth2client.client.Credentials应用于urllib2请求。

首先,获取credentials对象。在您的情况下,您正在使用:

credentials = flow.step2_exchange(oauth_code)

现在,使用该对象获取auth标头并将其添加到urllib2请求中:

req = urllib2.Request(url)
auth_headers = {}
credentials.apply(auth_headers)
for k,v in auth_headers.iteritems():
  req.add_header(k,v)
resp = urllib2.urlopen(req)

现在resp是一个类似文件的对象,可用于读取URL的内容