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

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

总结与后续

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

转载于:https://blog.51cto.com/eddy72/2103134

你可能感兴趣的:(Python 实现下载进度条(不带GUI界面))