首页/ 填坑/ 文章详情

Python 下载反馈机制:tqdm进度条的使用与中文异常处理

Python tqdm库 cmd 进度条 中文异常 发布于 2021-03-05

Python爬虫抓取页面时,除了文字信息外,还有图片,音频,视频等等文件资源。cmd运行执行命令,窗口完全黑盒子化处理,没有输出提示下,程序员完全不知道执行到那里。

特别在下载较大的文件资源时,文件是多大,文件下载需要多久时间,完全不知道,只能傻傻的等待结束。这种没有反馈信息的下载,不利于程序员的日常维护,为此解决这种事,需要引入额外的库——tqdm进度条。

tqdm 安装:

BSHpip install tqdm

tqdm 参数:

参数名 必选 类型 说明
iterable Object 进度条实体对象
total Number 进度条总大小
desc String 进度条文字描述
unit String 进度条下载单位,默认it

tqdm 例子:

PY# coding=utf-8

import requests
from tqdm import tqdm

if __name__ == '__main__':

	path = 'D://test//448681.mp3'	
	url = 'http://96.ierge.cn/14/224/448681.mp3' # 网上随便的的MP3资源
	result = requests.get(url,stream=True); # 设置stream流传输方式为真


	file_name = url.split('/')[-1];
	file_size = int(result.headers['Content-Length']) # 文件大小,单位B

	if file_size < 1024: # 单位B
		unit = 'B'
		iterable = result.iter_content(0)
		total = int(result.headers['Content-Length'])
	elif file_size >= 1024 and file_size < 1024 * 1024 : # 单位KB
		unit = 'KB'
		iterable = result.iter_content(1024)
		total = int(int(result.headers['Content-Length']) / 1024)
	else: # 单位MB
		unit = 'MB'
		iterable = result.iter_content(1024 * 1024)
		total = int(int(result.headers['Content-Length']) / 1024 / 1024)


	if result.status_code == 200:
		with open(path,'wb') as f:
			desc = ('{},文件大小:{}{}').format(file_name,total,unit).decode('UTF-8').encode('GBK')
			for chunk in tqdm(iterable=iterable, total=total, desc=desc, unit=unit):
				f.write(chunk)

现今的网络下载速度基本都能达到1MB/s以上,测试的mp3文件大小10MB,方便测试进度条效果。

tqdm 运行结果:

PYC:Python27>python tqdm.py
448681.mp3,文件大小:10MB:  10%|█▌             | 1/10 [00:00<00:08,  1.02MB/s
448681.mp3,文件大小:10MB:  20%|███            | 2/10 [00:01<00:07,  1.01MB/
448681.mp3,文件大小:10MB:  30%|████▌          | 3/10 [00:03<00:07,  1.01s
448681.mp3,文件大小:10MB:  40%|██████         | 4/10 [00:03<00:05,  1.01
448681.mp3,文件大小:10MB:  50%|███████▌       | 5/10 [00:04<00:04,  1.
448681.mp3,文件大小:10MB:  60%|█████████      | 6/10 [00:05<00:03,  1
448681.mp3,文件大小:10MB:  70%|██████████▌    | 7/10 [00:06<00:02,
448681.mp3,文件大小:10MB:  80%|████████████   | 8/10 [00:08<00:02,
448681.mp3,文件大小:10MB:  90%|█████████████▌ | 9/10 [00:09<00:0
448681.mp3,文件大小:10MB: 100%|██████████████| 10/10 [00:10<00:0
448681.mp3,文件大小:10MB: 11MB [00:10,  1.05MB/s]

※ 下载的文件太小,进度条直接快速到完成。

tqdm 参数desc含有中文的情况下,会突然报错:

PYUnicodeDecodeError:‘ascii’ code can’t decode byte 0xef in position 0: ordinal
not in range(128)

解决方案:

- 打开目录Python27Libsite-packages
- 新建文件 sitecustomize.py
- 编辑 sitecustomize.py 内容,保存,即可

sitecustomize.py 文件内容:

PYimport sys
sys.setdefaultencoding('gb2312')

文章评论0 records

最新 最早

0

最新评论Latest comments

凡心的仙人凡心的仙人 03-18 14:35
谢谢你了!
rantrismrantrism 2023-04-03 11:27
您好~我是腾讯云开发者社区运营,关注了您分享的技术文章,觉得内容很棒,我们诚挚邀请您加入腾讯云自媒体分享计划。完整福利和申请地址请见:https://cloud.tencent.com/developer/support-plan 作者申
唐牛才是食神唐牛才是食神 2022-06-15 10:51
(*°▽°*)八(*°▽°*)♪,解决了
唐牛才是食神唐牛才是食神 2022-06-15 10:49
发现不得了的东西,今晚回去好好研究下...
胖螺胖螺 2022-02-04 00:58
( ゜- ゜)つロ 在写了在写了。看到也有些感慨。因为站长前年在我原博客的留言,让我毅然选择去深造,选择读研,曾经我想过挺多东西的,还是自己本专业的适合我自己。在这先表达感谢。新年快乐!