1. 程式人生 > >python實現檔案下載(包含進度條顯示,檔案大小顯示,下載速度顯示)

python實現檔案下載(包含進度條顯示,檔案大小顯示,下載速度顯示)

不多說了,直接上程式碼記錄:

#!/usr/bin/lgy
#-*-coding:utf-8-*-

import urllib2,threading
from PyQt4.QtGui import *
from PyQt4.QtCore import *
from push_progress import *
from time import time

# 暫時沒用到 多執行緒任務下載用到
lock = threading.RLock()

class UpdateWidget(QWidget):
    def __init__(self,parent=None):
        super(UpdateWidget,self).__init__(parent)
        self.url = ""
        self.buffer = 10000
        self.start_size = 0
        self.end_size = 0
        self.fobj=""

        self.progress=QProgressBar()
        self.connect(self,SIGNAL("Getproess(float)"),self.ceshi2)

        self.size_layout=QHBoxLayout()
        self.sizetotal=QLabel()
        self.connect(self,SIGNAL("Getsizetotal(int)"),self.ceshi3) #接收
        self.sizenow=QLabel()
        self.connect(self,SIGNAL("Getsizenow(int)"),self.ceshi4)
        self.size_layout.addWidget(self.sizenow)
        self.size_layout.addWidget(self.sizetotal)
        self.size_layout.addStretch(1)

        self.speedlabel=QLabel()
        self.speedlabel.setText("50 kb/s")
        self.connect(self,SIGNAL("Getspeed(float)"),self.ceshi)
        self.main_layout=QVBoxLayout()
        self.main_layout.addWidget(self.progress)
        self.main_layout.addLayout(self.size_layout)
        self.main_layout.addWidget(self.speedlabel)

        self.setLayout(self.main_layout)
        self.download()
        self.resize(320,160)

    def download(self):
        url='http://down.360safe.com/se/360se7.3.0.146.exe'
        t = threading.Thread(target=self.main,args=(url, 1, 'c:/360.exe',10000))
        t.setDaemon(True)
        t.start()

    def ceshi(self,i):
        speed=round(i,2)
        #判斷Mb,Kb
        if speed>=1000:
            mbspeed=round(speed/1000,2)
            self.speedlabel.setText("{0} Mb/s".format(mbspeed))
        else:
            self.speedlabel.setText("{0} Kb/s".format(speed))


    def ceshi2(self,i):
        self.progress.setValue(round(i,2))
    def ceshi3(self,i):
        stol=round(float(i)/1024/1024,2)
        self.sizetotal.setText("{0} M".format(stol))
    def ceshi4(self,i):
        stol=round(float(i)/1024/1024,2)
        self.sizenow.setText("{0} M / ".format(stol))

    def _download(self,url, totalsize,fobj, buffer):
        start_time=time()
        req = urllib2.Request(url)
        f = urllib2.urlopen(req)
        # 初始化當前檔案位置偏移
        offset = 0
        while 1:
            block = f.read(buffer)
            # 當前執行緒資料獲取完畢後則退出
            if not block:
                print u'完成退出迴圈'
                break

            #當前耗時
            dural_time=float(time()) - float(start_time)
            # 設定檔案物件偏移地址
            fobj.seek(offset)
            # 寫入獲取到的資料
            fobj.write(block)
            offset = offset + len(block)
            #計算下載速度
            speed = (float(offset)/float(dural_time)/(1000*1000))*1000
            #計算下載進度
            proess=float(offset)/float(totalsize)*100
            #print proess
            self.emit(SIGNAL("Getsizenow(int)"),offset) #傳送當前檔案大小訊號
            self.emit(SIGNAL("Getproess(float)"),proess) #傳送當前進度
            self.emit(SIGNAL("Getspeed(float)"),speed)   #傳送當前下載速度

    def main(self,url, thread=1, save_file='', buffer=1024):
        # 獲取檔案的大小
        req = urllib2.urlopen(url)
        size = int(req.info().getheaders('Content-Length')[0])
        self.emit(SIGNAL("Getsizetotal(int)"),size)
        # 初始化檔案物件
        self.fobj = open(save_file, 'wb')
        t = self._download(url, size ,self.fobj, buffer)

        # 關閉檔案物件
        self.fobj.close()
        print u'下載完成!'

if __name__=='__main__':
    import sys
    app=QApplication(sys.argv)
    tree=UpdateWidget()
    tree.show()
    sys.exit(app.exec_())

後面的可自行拓展功能,效果如下:

下載360的速度有點快。。。。

相關推薦

python實現檔案下載(包含進度顯示檔案大小顯示下載速度顯示)

不多說了,直接上程式碼記錄: #!/usr/bin/lgy #-*-coding:utf-8-*- import urllib2,threading from PyQt4.QtGui import * from PyQt4.QtCore import * from pu

Python實現屏幕輸出進度的方法

python一般輸出到屏幕的時候是一組數據一次性全部顯示出來得。這是因為電腦為了提高效率,數據會先暫時放入緩存,等緩存滿了或者操作結束了,再一次性將數據進行處理。類似進度條的情況需要字符一次一個的蹦出來,這時候就需要使用flush()來強制執行這個處理緩存內數據的操作。上課講文件flush()的時候,最後提到

Java語言 瀏覽器下載檔案時沒有進度和預計檔案大小

文章地址:http://www.haoplay.top/tiezi/11_1_1.html解決方案:   在程式碼中新增:      response.setHeader("Content-Length", ""+file.length());

Android中使用AsyncTask實現下載檔案動態更新進度功能

1. 泛型AysncTask<Params, Progress, Result>Params:啟動任務時傳入的引數,通過呼叫asyncTask.execute(param)方法傳入。Progress:後臺任務執行的進度,若不用顯示進度條,則不需要指定。Result

異步下載圓形進度顯示進度

https ati ack blog nbsp idt 進度 circle osi 圓形進度條參考鏈接即可:使用css3實現圓形進度條 需求點擊下載後遮罩層顯示下載進度: 1.圓形進度條參考以上鏈接,有點小瑕疵,可更改定位距離實現重合。 2.遮罩層: .lbOverla

PHP 遠程文件下載進度實現

其他 compact AS lose 信息 tint spinner ajax style download.php 1 <?php 2 // 當前文件:download.php 3 4 $action = @$_GET[‘action‘]; 5

Canvas實現多個圓形進度顯示百分比並繫結各自的click事件

Canvas實現多個圓形進度條顯示百分比,並繫結各自的click事件 目錄 Canvas實現多個圓形進度條顯示百分比並繫結各自的click事件 目錄 實現效果 製

JS 檔案讀取的進度顯示方法(FileReader、onprogress)——20181116

這裡FileReader只是從磁碟把檔案讀取到瀏覽器,並沒有傳送到伺服器。參考連結1       參考連結2 <!DOCTYPE html> <html > <head> <meta charset="UTF-8"

java實現下載進度提示

1、實現原理         計算出已經處理的資料記錄數與所有需要匯出的資料記錄數的比例,根據每一個登陸使用者的不同將比例存入快取中,前臺設計一個定時器,每隔一段時間去快取中獲取比例,然後根據比例來展示一下下載的進度。 2、具體程式碼實現 //

【H5】手機瀏覽器分批次多張上傳圖片(檔案包含進度

描述 本文所描述的上傳檔案主要是應用於手機端,PC端可以酌情改造。 應用場景: 手機瀏覽器一次上傳多張圖片或者檔案,將檔案每5個拆分為一組上傳。上傳進度條為手機端上傳至後臺所用時間不包含後臺耗時。 選擇圖片用H5的input file標籤(能否選多張看瀏覽器了),上傳功能使

檔案上傳進度顯示

<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>Insert title here</title> <style>

利用AJAX技術實現網頁無重新整理進度顯示

在網頁中實現頁面無重新整理的進度條顯示不是一件很麻煩的事情,但如果這個進度條要能準確反映當前事務或者複雜邏輯的執行進度,那麼卻並不是一件容易的事情,目前AJAX技術流行,所以本文作者試想通過AJAX來實現網頁準確進度條,以銄讀者。首先應該想一個問題,複雜事務或者事務邏輯如果不

servlet+jquery實現檔案上傳進度

      現在檔案的上傳,特別是大檔案上傳,都需要進度條,讓客戶知道上傳進度。       本文簡單記錄下如何弄進度條,以及一些上傳資訊,比如檔案的大小,上傳速度,預計剩餘時間等一些相關資訊。程式碼是匆忙下簡單寫的,一些驗證沒做,或程式碼存在一些隱患,不嚴謹的地方。本文程

SSH實現進度的Ajax檔案上傳

// // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) // package util.upload; import com.opensymphony.xwo

SpringMVC實現檔案上傳進度Bootstrap展示

背景 想做一個帶進度條的檔案上傳,可是搜尋的結果都不是很滿意,最後參考一個實踐了一下,基於SpringMVC實現,前端採用Bootstrap。 整理一下進度條的實現。 效果 先看最後的效果 實現步驟 前提 SpringMVC已經配置

javaweb實現檔案上傳進度功能

一、建立幫助類package com.xxxx.xxxx.util;public class Progress {private long bytesRead;    private long contentLength;        private long items;

cgi 上傳檔案(c 語言) 進度顯示

//虛擬機器上搭建apache伺服器上傳檔案 //1.程式碼: #include "stdio.h" #include "string.h" #include "stdlib.h" #include "dirent.h" #include <wchar.h> #i

Jquery實現可拖動進度

div overflow 20px ext pan 點擊 技術分享 img ani html     <div class="progress"> <div class="progress_bg">

Linux中實現一個簡單的進度【轉】

做的 會有 發現 文件 rsquo 實時 時間 改進 常見 轉自:http://blog.csdn.net/yuehailin/article/details/53999288 說起進度條,其實大家常常見到,比如說你在下載視頻或文件的時候,提示你當前下載進度的就是我們今天

一個KVO 實現WKWebView加載進度的例子 (註意最後移除觀察者)

svi anim red all ini 一個 lap eat its // // OpenWebViewController.m // Treasure // // Created by 藍藍色信子 on 16/7/29. // Copyright ? 2016