python下载文件带进度条_Python显示进度条

一、进度条实现原理

进度条和一般的print区别在哪里呢?

答案就是print会输出一个n,也就是换行符,这样光标移动到了下一行行首,接着输出,之前已经通过stdout输出的东西依旧保留,而且保证我们在下面看到最新的输出结果。

进度条不然,我们必须再原地输出才能保证他是一个进度条,否则换行了怎么还叫进度条?

实现进度条最简单的办法就是,在输出完毕后,把光标移动到行首,继续在那里输出更长的进度条即可实现,新的更长的进度条把旧的短覆盖,就形成了动画效果。

二、实现方法

1、r转义实现

转义符r就可以把光标移动到行首而不换行,转义符n就把光标移动到行首并且换行。 在python中,输出stdout(标准输出)可以使用sys.stdout.write 例如:

#!/usr/bin/env python

# -*- coding=utf-8 -*-

#Using GPL v2

"""

Usage:

Just A Template

"""

from __future__ import division

import sys,time

j = '#'

if __name__ == '__main__':

for i in range(1,61):

j += '#'

sys.stdout.write(str(int((i/60)*100))+'% ||'+j+'->'+"r")

sys.stdout.flush()

time.sleep(0.5)

print

2、b转义实现法

第二种思路是用转义符b 转义符b是退格键,也就是说把输出的光标往回退格子,这样就可以不用+=了,例如:

#!/usr/bin/env python

# -*- coding=utf-8 -*-

#Using GPL v2

"""

Usage:

Just A Template

"""

from __future__ import division

import sys,time

if __name__ == '__main__':

for i in range(1,61):

sys.stdout.write('#'+'->'+"bb")

sys.stdout.flush()

time.sleep(0.5)

print

3、progressbar模块实现法

python一个比较强大方便的地方,就是有各种别人做好的类库。我们只需要通过import引入即可。这里可以用下progressbar模块(目前最新版是2.3开发版),效果如下:

progressbar.png

上图中使用的是稳定版2.2的版本。四个示例的示码如下(在该模块的progressbar.py文件中可以查到):

def example1():

widgets = ['Test: ', Percentage(), ' ', Bar(marker=RotatingMarker()),

' ', ETA(), ' ', FileTransferSpeed()]

pbar = ProgressBar(widgets=widgets, maxval=10000000).start()

for i in range(1000000):

# do something

pbar.update(10*i+1)

pbar.finish()

print

def example2():

class CrazyFileTransferSpeed(FileTransferSpeed):

"It's bigger between 45 and 80 percent"

def update(self, pbar):

if 45 < pbar.percentage() < 80:

return 'Bigger Now ' + FileTransferSpeed.update(self,pbar)

else:

return FileTransferSpeed.update(self,pbar)

widgets = [CrazyFileTransferSpeed(),' <<<', Bar(), '>>> ', Percentage(),' ', ETA()]

pbar = ProgressBar(widgets=widgets, maxval=10000000)

# maybe do something

pbar.start()

for i in range(2000000):

# do something

pbar.update(5*i+1)

pbar.finish()

print

def example3():

widgets = [Bar('>'), ' ', ETA(), ' ', ReverseBar('<')]

pbar = ProgressBar(widgets=widgets, maxval=10000000).start()

for i in range(1000000):

# do something

pbar.update(10*i+1)

pbar.finish()

print

def example4():

widgets = ['Test: ', Percentage(), ' ',

Bar(marker='0',left='[',right=']'),

' ', ETA(), ' ', FileTransferSpeed()]

pbar = ProgressBar(widgets=widgets, maxval=500)

pbar.start()

for i in range(100,500+1,50):

time.sleep(0.2)

pbar.update(i)

pbar.finish()

print

4、progressive模块

progressive模块只适用于python2.7以上的版本。效果如下:

progressive.gif

progressive模块的安装方法如下:

pip install progressive

git clone https://github.com/hfaran/progressive.git

cd progressive

python setup.py install

Python中,使用`requests`库下载文件时,可以通过自定义一个进度条显示下载进度。以下是一个基本的实现方法: 首先,需要安装`requests`库(如果尚未安装): ```bash pip install requests ``` 然后,可以使用以下代码来实现进度条文件下载: ```python import requests from tqdm import tqdm def download_file(url, file_name): # 发起请求并获取响应对象 response = requests.get(url, stream=True) # 确保请求成功 response.raise_for_status() # 获取文件总大小 total_size = int(response.headers.get('content-length', 0)) # 打开文件准备写入 with open(file_name, 'wb') as file: # 使用tqdm创建进度条 for data in tqdm(response.iter_content(1024), total=total_size/1024, unit='KB', unit_scale=True): # 将数据写入文件 file.write(data) # 使用示例 download_url = 'http://example.com/file.zip' # 替换为你需要下载文件链接 download_file(download_url, 'downloaded_file.zip') ``` 在上述代码中,`requests.get`用于发起网络请求,`stream=True`参数使得我们能够以流的方式处理数据,而不是一次性加载整个文件到内存。`response.iter_content`方法用于迭代文件内容,我们以1024字节为单位进行迭代,并使用`tqdm`库来创建和更新进度条。 注意,`tqdm`是一个快速、可扩展的Python进度条库,它可以在长循环中添加一个进度提示信息,用户只需要封装任意的迭代器`tqdm(iterator)`。如果你没有安装`tqdm`,可以通过以下命令安装: ```bash pip install tqdm ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值