You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中使用alive-progress实现下载进度条异常问题求助

问题:添加alive-progress进度条后功能异常,但文件仍可正常下载

我编写了一个从链接下载MP4视频的Python程序,原代码能正常完成下载,但尝试用alive-progress添加实时进度条后,进度条功能异常,不过文件还是能正常下载。

原下载代码

chunk_size = 256
URL = 'https://gogodownload.net/download.php?url=aHR0cHM6LyAdrefsdsdfwerFrefdsfrersfdsrfer363435349URASDGHUSRFSJGYfdsffsderFStewthsfSFtrftesdfseWVpYnU0bmM3LmdvY2RuYW5pLmNvbS91c2VyMTM0Mi9lYzBiNzk3NmM1M2Q4YmY5MDU2YTYwNjdmMGY3ZTA3Ny9FUC4xLnYwLjM2MHAubXA0P3Rva2VuPW8wVnNiR3J6ZXNWaVA0UkljRXBvc2cmZXhwaXJlcz0xNjcxOTkzNzg4JmlkPTE5MzU1Nw=='
x = requests.head(URL)
y = requests.head(x.headers['Location'])

file_size = int(y.headers['content-length'])

response = requests.get(URL, stream=True)
with open('video.mp4', 'wb') as f:
    for chunk in response.iter_content(chunk_size=chunk_size):
        f.write(chunk)

添加进度条后的代码

def compute():
    response = requests.get(URL, stream=True)
    with open('video.mp4', 'wb') as f:
        for chunk in response.iter_content(chunk_size=chunk_size):
            f.write(chunk)
            yield 256

with alive_bar(file_size) as bar:
    for i in compute():
        bar()

异常情况

进度条显示混乱,数值远超文件总大小,无法正确反映实际下载进度。

解决方案

问题根源在于每次固定返回256,且调用bar()默认只累加1,和实际下载的字节数不匹配。修改方式如下:

修改后的代码

chunk_size = 256
URL = 'https://gogodownload.net/download.php?url=aHR0cHM6LyAdrefsdsdfwerFrefdsfrersfdsrfer363435349URASDGHUSRFSJGYfdsffsderFStewthsfSFtrftesdfseWVpYnU0bmM3LmdvY2RuYW5pLmNvbS91c2VyMTM0Mi9lYzBiNzk3NmM1M2Q4YmY5MDU2YTYwNjdmMGY3ZTA3Ny9FUC4xLnYwLjM2MHAubXA0P3Rva2VuPW8wVnNiR3J6ZXNWaVA0UkljRXBvc2cmZXhwaXJlcz0xNjcxOTkzNzg4JmlkPTE5MzU1Nw=='
x = requests.head(URL)
y = requests.head(x.headers['Location'])

file_size = int(y.headers['content-length'])

def compute():
    response = requests.get(URL, stream=True)
    with open('video.mp4', 'wb') as f:
        for chunk in response.iter_content(chunk_size=chunk_size):
            if chunk:  # 过滤空chunk
                chunk_len = len(chunk)
                f.write(chunk)
                yield chunk_len

with alive_bar(file_size) as bar:
    for chunk_len in compute():
        bar(chunk_len)

修改说明

  1. 传递实际chunk长度:不再固定返回256,而是获取每个chunk的真实长度并返回,因为iter_content返回的最后一个chunk通常小于设定的chunk_size。
  2. 更新对应字节数进度:调用bar(chunk_len),让进度条累加实际下载的字节数,而非默认的+1,这样进度会和真实下载量匹配。
  3. 过滤空chunk:增加if chunk:判断,避免写入空chunk导致的无效进度更新。

内容的提问来源于stack exchange,提问作者Mythical Phantom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 09:30:57