使用 TQDM 几乎使我的 GET 请求的文件大小增加了一倍

Posted

技术标签:

【中文标题】使用 TQDM 几乎使我的 GET 请求的文件大小增加了一倍【英文标题】:Using TQDM almost doubles the file size of my GET request 【发布时间】:2021-03-25 22:07:36 【问题描述】:

我一直在编写代码来下载互联网的 GRIB(天气)文件以供将来使用。现在,我只是在正确的文件夹中下载和写入的阶段,但由于某种原因,当我使用 TQDM 作为进度条时,文件大小几乎翻了一番。没有进度,文件大小很好。

使用以下代码,我得到一个 2.3MB 的文件。

import datetime
fsearch = datetime.date.today().strftime('%Y%m%d00')
def sfc_pres():
    id = fsearch
    url = 'https://dd.weather.gc.ca/ensemble/geps/grib2/raw/00/000/CMC_geps-raw_PRES_SFC_0_latlon0p5x0p5_0_P000_allmbrs.grib2'.format(id)
    r = requests.get(url, allow_redirects=True)
    stat=r.status_code
    while stat:
        if stat==200:
            print('Fichier trouvé, téléchargement')
        elif stat==404:
            print('Fichier introuvable')
        break
    id = fname
    with open(r'C:\Users\JM\Desktop\GRIB\Pression de surface 00UTC 0.grib2'.format(id) , 'wb') as f:
        f.write(r.content)

如果我将 TQDM 用于这样的进度条,我会得到一个 4.5MB 的文件。

import datetime
fsearch = datetime.date.today().strftime('%Y%m%d00')
fname = datetime.date.today().strftime('%d-%m-%Y')
def sfc_pres():
   id = fsearch
   url = 'https://dd.weather.gc.ca/ensemble/geps/grib2/raw/00/000/CMC_geps-raw_PRES_SFC_0_latlon0p5x0p5_0_P000_allmbrs.grib2'.format(id)
   r = requests.get(url, allow_redirects=True)
   stat=r.status_code
   while stat:
       if stat==200:
           print('Fichier trouvé, téléchargement')
       elif stat==404:
           print('Fichier introuvable')
       break
   from tqdm import tqdm
   total_size_in_bytes= int(r.headers.get('content-length', 0))
   block_size = 1024
   progress_bar = tqdm(total=total_size_in_bytes, unit='iB', unit_scale=True)
   id = fname
   with open(r'C:\Users\JM\Desktop\GRIB\Pression de surface 00UTC 0.grib2'.format(id) , 'wb') as f:
       f.write(r.content)
       for data in r.iter_content(block_size):
           progress_bar.update(len(data))
           f.write(data)
   progress_bar.close()
   if total_size_in_bytes != 0 and progress_bar.n != total_size_in_bytes:
       print("Échec du téléchargement")

我的故障排除让我知道它在 TQDM 代码中,但我找不到原因...

【问题讨论】:

【参考方案1】:

如果您使用的是r.iter_content,则不应同时调用f.write(r.content) - 那么您将写入两次数据(并失去您试图获得的流式传输行为)。

【讨论】:

以上是关于使用 TQDM 几乎使我的 GET 请求的文件大小增加了一倍的主要内容,如果未能解决你的问题,请参考以下文章

多处理:使用 tqdm 显示进度条

为啥每次迭代我的 tqdm 进度条都显示在新行上?

如何使我的本地服务器区分大小写?

在图像大小和图像压缩之间进行选择以供 Web 使用的指南

使用 CGContext 调整 UIImage 的大小会使我的图像变软,像素密度错误

带 tqdm 的 asyncio aiohttp 进度条