使用 TQDM 几乎使我的 GET 请求的文件大小翻倍

Using TQDM almost doubles the file size of my GET request

我一直在编写代码来下载 Internet 的 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 代码中,但我找不到原因...

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