2012-05-09 2 views
4

Я пытаюсь загрузить файлы с помощью запросов python. Он работал в python 2.7, но не сейчас. Я действительно смущен и должен быть более простой ответ. Поскольку файлы могут быть довольно большими, я действительно хочу прогрессбар, и я использую presson procressbar для выполнения этой работы.Python 3 и запросы с индикатором прогресса

   r = requests.get(file_url, data={'track': 'requests'}) 
       size = int(r.headers['Content-Length'].strip()) 
       self.bytes = 0 
       widgets = [name, ": ", Bar(marker="|", left="[", right=" "), 
        Percentage(), " ", FileTransferSpeed(), "] ", 
        self, 
        " of {0}MB".format(round(size/1024/1024, 2))] 
       pbar = ProgressBar(widgets=widgets, maxval=size) 
       pbar.start() 

       file = b"" 
       for chunk in r.iter_content() 
        if chunk: 
         file += chunk 

         self.bytes += 1 
         pbar.update(self.bytes) 

Я обнаружил, что использование iter_content было лучшим способом получить непрерывное обновление. Я попробовал iter_lines, но это испортило файлы. Он перестает загружаться внезапно и действительно медленный, требуется 15 минут, чтобы загрузить 10%, после чего он останавливается. И попытка открыть файл в режиме байта, и запись на него не работает, он вообще не вызывает ошибку. И когда я пытаюсь напечатать то, что содержит кусок

print(chunk.decode("utf-8") 

Работы, но всего несколько символов. В какой-то момент он жалуется на

UnicodeDecodeError: 'utf8' codec can't decode byte 0xff in position 0: invalid start byte 

Даже при использовании "decode_unicode = True" в iter_content ничего не делает. Я в тупике и не знаю, что делать. Это не должно быть трудно использовать Py3k.

ответ

4

Удалось устранить проблему. Так вот обновленный фрагмент кода:

r = requests.get(file_url) 
size = int(r.headers['Content-Length'].strip()) 
self.bytes = 0 
widgets = [name, ": ", Bar(marker="|", left="[", right=" "), 
    Percentage(), " ", FileTransferSpeed(), "] ", 
    self, 
    " of {0}MB".format(str(round(size/1024/1024, 2))[:4])] 
pbar = ProgressBar(widgets=widgets, maxval=size).start() 
file = [] 
for buf in r.iter_content(1024): 
    if buf: 
     file.append(buf) 
     self.bytes += len(buf) 
     pbar.update(self.bytes) 
pbar.finish() 

Скорость загрузки изменяется от 7Кб/с до 400+ кб/с. И он полностью работает.

+0

Не будет ли это фактически индикатором выполнения записи его в файл, поскольку запрос выполняется, когда вы выполняете вызов request.get()? – antihero

+0

Функция request.get() возвращает объект Response. Это ничего не делает, если вы ничего не делаете с ним (например, r = request.get (file_url); r.text). Я перебирал контент, когда он загружается. Мне пришлось сначала сохранить его в файл :) – thabubble

+0

@thabubble На самом деле вам нужно вызвать 'request.get (file_url, prefetch = False)', чтобы ваше утверждение было истинным. В противном случае, @antihero точно прав. – heycosmo

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