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

Posted

技术标签:

【中文标题】为啥每次迭代我的 tqdm 进度条都显示在新行上?【英文标题】:Why does my tqdm progress bar display on a new line for every iteration?为什么每次迭代我的 tqdm 进度条都显示在新行上? 【发布时间】:2020-06-24 10:44:59 【问题描述】:

我正在从事一个个人项目,我使用请求从网站获取数据。其中一个文件非常大,所以我想包含一个进度条作为“生命迹象”。

虽然我基于 tqdm 文档中的示例,但下载位有效,但进度条不断输出新行。

代码如下:

def download_data() -> BinaryIO:
    """Download the two zipped data packages
    from the Open Power System Data website.

    Returns
    -------
    BinaryIO
        Saves the two packages in Data/Raw
    """
    urls = [GENERATION_CAPACITY_URL, TIME_SERIES_URL]

    for url in urls:
        # Gets the filename directly from the url, saves us having to name it
        url_filename = Path(urlparse(url).path).name

        # Check if exists before doing lengthy download
        if not Path.exists(RAW_DATA / url_filename):

            # Stream = True because files are quite large
            with requests.get(url, stream=True) as response:

                # Check connection first, will raise HTTPError if bad
                response.raise_for_status()

                chunk_size = 1024 * 1024

                print(f"Downloading url_filename")

                with open(RAW_DATA / url_filename, "wb") as f:
                    with tqdm(
                        unit="B",
                        unit_scale=True,
                        unit_divisor=1024,
                        total=int(response.headers.get("content-length", 0)),
                    ) as pbar:

                        for chunk in response.iter_content(chunk_size=chunk_size):
                            f.write(chunk)
                            pbar.update(len(chunk))

        else:
            print(f"File: url_filename already exists")

我在 name == main 条件中调用下面的函数(为清楚起见未显示)

当我运行文件时,我会看到一个进度条,该进度条会随着文件下载而更新,但每次更新似乎都会在新行上呈现一个新进度条,而不是一个永久进度条,该进度条只是沿着屏幕移动(如你会期望的)

即而不是:

[|||||| 3%]

我明白了

[| 1%]
[| 1%]
[|| 2%]
[||| 3%]

一直不停,直到完成。

不确定我是否做错了什么,我就是想不通!

【问题讨论】:

【参考方案1】:

你需要输入leave=True关键字

with tqdm(unit="B", unit_scale=True, unit_divisor=1024, total=int(response.headers.get("content-length", 0)),leave=True ) 作为 pbar:

【讨论】:

以上是关于为啥每次迭代我的 tqdm 进度条都显示在新行上?的主要内容,如果未能解决你的问题,请参考以下文章

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

Python 超方便的迭代进度条 (Tqdm)

Jupyter Notebook 中的 tqdm 重复打印新的进度条

Python进度条:tqdm

tqdm库,给你的Python代码加个进度条

tqdm:Python 进度条