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)
修改说明
- 传递实际chunk长度:不再固定返回256,而是获取每个chunk的真实长度并返回,因为
iter_content返回的最后一个chunk通常小于设定的chunk_size。 - 更新对应字节数进度:调用
bar(chunk_len),让进度条累加实际下载的字节数,而非默认的+1,这样进度会和真实下载量匹配。 - 过滤空chunk:增加
if chunk:判断,避免写入空chunk导致的无效进度更新。
内容的提问来源于stack exchange,提问作者Mythical Phantom
相关产品推荐
相关产品推荐

