Подтвердить что ты не робот

Request.iter_content() получает неполный файл (1024 МБ вместо 1,5 ГБ)?

Привет, я использовал этот фрагмент кода для загрузки файлов с веб-сайта, пока файлы размером менее 1 ГБ - все хорошо. но я заметил, что файл объемом 1,5 ГБ является неполным

# s is requests session object
r = s.get(fileUrl, headers=headers, stream=True)

start_time = time.time()
with open(local_filename, 'wb') as f:
    count = 1
    block_size = 512
    try:
        total_size = int(r.headers.get('content-length'))
        print 'file total size :',total_size
    except TypeError:
        print 'using dummy length !!!'
        total_size = 10000000

    for chunk in r.iter_content(chunk_size=block_size):

        if chunk:  # filter out keep-alive new chunks

            duration = time.time() - start_time
            progress_size = int(count * block_size)
            if duration == 0:
                duration = 0.1
            speed = int(progress_size / (1024 * duration))
            percent = int(count * block_size * 100 / total_size)
            sys.stdout.write("\r...%d%%, %d MB, %d KB/s, %d seconds passed" %
                            (percent, progress_size / (1024 * 1024), speed, duration))

            f.write(chunk)
            f.flush()
            count += 1

с использованием последних запросов 2.2.1 python 2.6.6, centos 6.4 загрузка файла всегда останавливается на 66.7% 1024 МБ, что мне не хватает? вывод:

file total size : 1581244542
...67%, 1024 MB, 5687 KB/s, 184 seconds passed

кажется, что генератор, возвращаемый iter_content(), считает, что все куски извлечены, и нет ошибки. btw часть исключения не запускалась, потому что сервер действительно возвращал длину содержимого в заголовке ответа.

4b9b3361

Ответ 1

Пожалуйста, дважды проверьте, что вы можете загрузить файл через wget и/или любой обычный браузер. Это может быть ограничение на сервере. Как я вижу , ваш код может загружать большие файлы (больше 1,5 ГБ)

Обновление: попробуйте инвертировать логику - вместо

if chunk: # filter out keep-alive new chunks                                                                                                                                                                                                         
    f.write(chunk)                                                                                                                                                                                                                                   
    f.flush()

попробовать

if not chunk:
   break

f.write(chunk)                                                                                                                                                                                                                                   
f.flush()

Ответ 2

Я думаю, что вы забыли закрыть req.

из запросов автора сказано: "Если вы обнаружите, что частично читаете тела запросов (или вообще не читаете их) при использовании stream = True, вы должны сделать запрос в операторе with, чтобы он всегда был закрыт:"

http://2.python-requests.org//en/latest/user/advanced/#body-content-workflow,