Python 实现下载进度条(不带GUI界面)

话不多说,先上图

该Python代码可以实现获取下载的文件名,下载文件的大小,下载速度等。

代码关键点:

1、关于下载文件名的获取:代码里使用两种方式获取:
(1) 通过Content-Disposition属性,该属性是作为对下载文件的一个标识字段,存储着下载文件名

(2) 直接通过链接获取,例如:sw.bos.baidu.com/sw-search-sp/software/8b23f8846df3d/BaiduMusicSetup.exe 文件后面直接就是文件名称了。
2、关于下载文件大小的获取:直接从HTTP的响应信息中获取,在Content-Length中

3、requests.get(url)默认是下载在内存中的,下载完成才存到硬盘上,这样就无法获取当前下载进度了,所以要设置边下边存硬盘

    def downfile(self,filename):  #下载文件
        self.r = requests.get(self.url,stream=True)
        with open(filename, "wb") as code:
            for chunk in self.r.iter_content(chunk_size=1024): #边下载边存硬盘
                if chunk:
                    code.write(chunk)

附上Python代码:

import threading
import os
import requests
import time
import re
import urllib
def view_bar(num, total):  #显示进度条
    rate = num/total
    rate_num = int(rate * 100)
    number=int(50*rate)
    r = ‘\r[%s%s]%d%%‘ % ("#"*number, " "*(50-number), rate_num, )
    print("\r {}".format(r),end=" ")   #\r回到行的开头
class Getfile():  #下载文件
    def __init__(self,url):
        self.url=url
        #self.filename=filename
        self.re=requests.head(url,allow_redirects=True)  #运行head方法时重定向
    def getsize(self):
        try:
            self.file_total=int(self.re.headers[‘Content-Length‘]) #获取下载文件大小
            return self.file_total
        except:
            print(‘无法获取下载文件大小‘)
            exit()
    def getfilename(self):  #获取默认下载文件名
        filename=‘‘
        if ‘Content-Disposition‘ in self.re.headers:
            n=self.re.headers.get(‘Content-Disposition‘).split(‘name=‘)[1]
            filename=urllib.parse.unquote(n,encoding=‘utf8‘)
        elif os.path.splitext(self.re.url)[1]!=‘‘:
            filename=os.path.basename(self.re.url)
        return filename
    def downfile(self,filename):  #下载文件
        self.r = requests.get(self.url,stream=True)
        with open(filename, "wb") as code:
            for chunk in self.r.iter_content(chunk_size=1024): #边下载边存硬盘
                if chunk:
                    code.write(chunk)
        time.sleep(1)
        #print ("\n下载完成")
    def downprogress(self,filename):
        self.filename=filename
        self.file_size=0
        self.file_total=self.getsize()
        while self.file_size<self.file_total:  #获取当前下载进度
            time.sleep(1)
            if os.path.exists(self.filename):
                self.down_rate=(os.path.getsize(self.filename)-self.file_size)/1024/1024
                self.down_time=(self.file_total-self.file_size)/1024/1024/self.down_rate
                print (" "+str(‘%.2f‘ %self.down_rate+"MB/s"),end="")
                self.file_size=os.path.getsize(self.filename)
            print (" "+str(int(self.down_time))+"s",end="")
            print (" "+str(‘%.2f‘ %(self.file_size/1024/1024))+"MB",end="")
            view_bar(self.file_size, self.file_total)
if __name__ == ‘__main__‘:
    url = input("输入网址:")
    while not re.match(‘^(https?|ftp)://.+$‘,url):
        url = input("网址格式错误,请重新输入:")
    file1=Getfile(url)
    file_total=file1.getsize()
    filename=file1.getfilename()
    if filename==‘‘:
        filename=input(‘无法获取下载文件名,请自行输入:‘)
    print ("下载的文件为:"+str(‘%.2f‘ % (file_total/1024/1024))+"MB")
    print ("开始下载文件:"+filename)
    t1 = threading.Thread(target=file1.downfile,args=(filename,))
    t1.start()
    file1.downprogress(filename)

源代码也上传到http://down.51cto.com/data/2445550

总结与后续

这次是用Python类的形式来写代码,写的时候有点不太习惯,可是更改或者维护代码的时候,感觉挺方便。
这代码只是在dos命令行下运行的,接下来的任务是使用tkinter增加GUI界面

原文地址:http://blog.51cto.com/eddy72/2103134

时间: 2024-07-30 16:40:34

Python 实现下载进度条(不带GUI界面)的相关文章

#Python绘制 文本进度条,带刷新、时间暂缓的

#Python绘制 文本进度条,带刷新.时间暂缓的 #文本进度条 import time as T st=T.perf_counter() print('-'*6,'执行开始','-'*6) maxx=11 #要大1 for i in range(maxx): s1='*'*i s2='->' s3='.'*(maxx-i-1) T.sleep(0.5) #假装有延时 dur=T.perf_counter()-st print("\r%3d%%[%s%s%s] %.2fs"%(i

Python HTTP下载文件并显示下载进度条

下面的Python脚本中利用request下载文件并写入到文件系统,利用progressbar模块显示下载进度条. 其中利用request模块下载文件可以直接下载,不需要使用open方法,例如: import urllib import requests.packages.urllib3 requests.packages.urllib3.disable_warnings() url = "https://raw.githubusercontent.com/racaljk/hosts/maste

python实现的、带GUI界面电影票房数据可视化程序

代码地址如下:http://www.demodashi.com/demo/14588.html 详细说明: Tushare是一个免费.开源的python财经数据接口包.主要实现对股票等金融数据从数据采集.清洗加工 到 数据存储的过程,能够为金融分析人员提供快速.整洁.和多样的便于分析的数据. 完成本项目后,可以进一步通过类似的方法实现股票数据的可视化操作. (代码在python2.7或python3.6下均能正常运行,已在以下环境中进行过测试: python2.7 + tushare0.9.8

Flex 4.6 下载进度条 IPreLoaderDisplay生命周期

Flex4.6 程序的主类实际上为SystemManager的子类.SystemManager会创建Preloader对象,然后调用PreLoader对象的initialize方法,该方法有如下签名  public function initialize(showDisplay:Boolean,                                 displayClassName:Class,                                backgroundColo

关情纸尾-----Quartz2D绘制下载进度条,饼图

绘制下载进度条 1.搭建界面. 2.拖动滑竿的时候让他里面的能够跟着我的拖动,数字在改变. 数字改变时有一个注意点, 就是要显示%,它是一个特殊的符号,要用两个%%代表一个% 3.拖动滑竿的时候就是在上面画弧. 从最上面,按顺时针画,所以,它的起始角度是-90度.结束角度也是-90度 也是从起始角度开始画, 起始角度-90度, 看你下载进度是多少 假如说你下载进度是100,就是1 * 360度 也就是说这个进度占你360度多少分之一 CGContextRef ctx = UIGraphicsGe

用 CALayer 定制下载进度条控件

// // RPProgressView.h // CALayer定制下载进度条控件 // // Created by RinpeChen on 16/1/2. // Copyright © 2016年 rinpe. All rights reserved. // #import <UIKit/UIKit.h> @interface RPProgressView : UIView @property (nonatomic, assign) CGFloat progressValue; // 进

HTML5 CSS3 诱人的实例 : 网页加载进度条的实现,下载进度条等

今天给大家带来一个比较炫的进度条,进度条在一耗时操作上给用户一个比较好的体验,不会让用户觉得在盲目等待,对于没有进度条的长时间等待,用户会任务死机了,毫不犹豫的关掉应用:一般用于下载任务,删除大量任务,网页加载等:如果有使用html5为手机布局的,也可以用于手机中~ 效果图: 1.html结构: <div id="loadBar01" class="loadBar"> <div> <span class="percent&qu

仿苹果AppStore 下载进度条

以前项目自己写的 ,一个模仿苹果AppStore 下载进度条的winfrom用户控件,GDI绘制.效果如图 1 using System.Drawing; 2 using System.Windows.Forms; 3 using System.ComponentModel; 4 namespace test 5 { 6 public class CircleProgressBar : Control 7 { 8 float _progress = 0F; 9 float _Wpen = 1;

[Python]命令行进度条

关键点是输出'\r'这个字符可以使光标回到一行的开头,这时输出其它内容就会将原内容覆盖. import time import sys def progress_test(): bar_length=20 for percent in xrange(0, 100): hashes = '#' * int(percent/100.0 * bar_length) spaces = ' ' * (bar_length - len(hashes)) sys.stdout.write("\rPercent