Я пытаюсь загрузить файлы с помощью запросов 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.
Не будет ли это фактически индикатором выполнения записи его в файл, поскольку запрос выполняется, когда вы выполняете вызов request.get()? – antihero
Функция request.get() возвращает объект Response. Это ничего не делает, если вы ничего не делаете с ним (например, r = request.get (file_url); r.text). Я перебирал контент, когда он загружается. Мне пришлось сначала сохранить его в файл :) – thabubble
@thabubble На самом деле вам нужно вызвать 'request.get (file_url, prefetch = False)', чтобы ваше утверждение было истинным. В противном случае, @antihero точно прав. – heycosmo