2015-02-16 3 views
2

Можно ли загрузить большой файл в кусках с помощью httplib2. Я загружаю файлы из Google API, и для использования учетных данных из Google OAuth2WebServerFlow я обязан использовать httplib2.Как загрузить большой файл с помощью 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.

Любой способ чтения ответа в кусках?

+1

Это работает? Вы получаете какие-либо ошибки? –

+0

Это работает, но его нехорошо иметь переменные 500 Мбайт –

+0

В Python 3.4 это работает: https://docs.python.org/3/library/http.client.html#examples –

ответ

0

Вы можете рассмотреть streaming_httplib2, вилку httplib2 с точно такими изменениями в поведении.

, чтобы использовать учетные данные из google OAuth2WebServerFlow, я обязан использовать httplib2.

Если вам нужны функции, недоступные в httplib2, стоит посмотреть, сколько будет работы, связанной с обработкой учетных данных с другой библиотекой HTTP. Это может быть хорошая долгосрочная инвестиция. (., Например, How to download large file in python with requests.py?)

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() 
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-адреса

Смежные вопросы