Как получить правильный размер файла для gzip перед загрузкой - PullRequest
1 голос
/ 07 апреля 2020

В настоящее время я пытаюсь загрузить сжатый gzip-файл набора данных с веб-сайта и использовать библиотеку tqdm для отображения прогресса загрузки. Однако я заметил, что индикатор выполнения tqdm будет переполнен из-за неточного размера файла из «Content-Length» в заголовке ответа. Я вставлю приведенный ниже пример кода в качестве ссылки:

import requests
from tqdm import tqdm

url = 'https://www.cs.cmu.edu/~./enron/enron_mail_20150507.tar.gz'
filename = url.split('/')[-1]

with requests.get(url, stream=True) as req:
    with open(filename, 'wb') as file:
        print('downloading the Enron dataset')
        total_size = int(req.headers['Content-Length'])
        print(req.headers)
        progress = tqdm(total=(total_size),
            unit='iB', unit_scale=True, unit_divisor=1024, ascii=' █',
            bar_format='{l_bar}{bar:50}{r_bar}{bar:-50b}')
        for chunk in req.iter_content(chunk_size=1024):
            if chunk:
                progress.update(len(chunk))
                file.write(chunk)
        print('download complete!')

Я провел поиск, но не смог найти хорошего решения этой проблемы. Есть ли способы заранее определить размер файла gzip, который нужно загрузить? Или какие-либо предложения, чтобы обойти это?

Ответы [ 2 ]

0 голосов
/ 11 апреля 2020
import requests
from hurry.filesize import size

headers = {'accept-encoding': ''}


def main(url):
    r = requests.head(url, headers=headers)
    cl = int(r.headers['Content-Length'])
    print(size(cl))


main("https://www.cs.cmu.edu/~./enron/enron_mail_20150507.tar.gz")

Выход:

422M
0 голосов
/ 11 апреля 2020

Есть альтернативный способ найти размер. Но этот метод не может быть использован для вашего файла, так как это может занять много лет (я думаю). Это:

res = requests.get('https://www.cs.cmu.edu/~./enron/enron_mail_20150507.tar.gz')
file_size = len(res.content)

Редактировать!
Нашли решение:

file_size = int(requests.head('https://www.cs.cmu.edu/~./enron/enron_mail_20150507.tar.gz', headers={'accept-encoding': ''}).headers['Content-Length'])
...