日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

使用python下載大型文件顯示進度條和下載時間的操作代碼_python

作者:安替-AnTi ? 更新時間: 2022-12-04 編程語言

推薦閱讀

Python 給下載文件顯示進度條和下載時間的實現

requets普通方法

下載大型文件時,我們一般都是這樣下載的

import requests
url = ""
r = requests.get(url)
with open('1.mp4', 'wb') as f:
    f.write(r.content)

這樣下載大型文件時存在一個問題,那就是內存使用量迅速上升,可能會造成電腦卡死。所以我們需要換一個方式進行下載

流下載

我們可以使用文本流進行下載.
requests模塊中有一個這樣的方法Response.iter_content()
Response響應對象的一個方法

iter_content(chunk_size=1, decode_unicode=False)

在響應數據上進行重做。當stream=True設置在請求上時,這可以避免立即將內容讀入內存以獲得大響應。塊大小是它應該讀入內存的字節數。這不一定是每個返回的項目的長度,因為解碼可以進行。

chunk_size必須是類型 int 或 None。值為None時會因stream的值而異。stream-True將讀取數據的字塊大小與接收的區塊相同。如果stream=False,則數據將作為單個塊返回。

如果decode_unicode設置為真,響應內容將根據使用最佳編碼進行解碼。

需要在get請求上設置參數stream為True,它不會立即開始下載,當使用iter_content遍歷內容或訪問內容屬性時才開始下載。

代碼實現:

url = ""
r = requests.get(url, headers=header, stream=True)
with open('1.mp4', "wb") as f:
        for chunk in r.iter_content(chunk_size=1024):
            if chunk:
                f.write(chunk)

加個進度條模塊

# 進度條模塊
def progressbar(url,path):
    if not os.path.exists(path):   # 看是否有該文件夾,沒有則創建文件夾
         os.mkdir(path)
    start = time.time() #下載開始時間
    response = requests.get(url, stream=True) #stream=True必須寫上
    size = 0    #初始化已下載大小
    chunk_size = 1024  # 每次下載的數據大小
    content_size = int(response.headers['content-length'])  # 下載文件總大小
    try:
        if response.status_code == 200:   #判斷是否響應成功
            print('Start download,[File size]:{size:.2f} MB'.format(size = content_size / chunk_size /1024))   #開始下載,顯示下載文件大小
            filepath = path+'\name.extension name'  #設置圖片name,注:必須加上擴展名
            with open(filepath,'wb') as file:   #顯示進度條
                for data in response.iter_content(chunk_size = chunk_size):
                    file.write(data)
                    size +=len(data)
                    print('\r'+'[下載進度]:%s%.2f%%' % ('>'*int(size*50/ content_size), float(size / content_size * 100)) ,end=' ')
        end = time.time()   #下載結束時間
        print('Download completed!,times: %.2f秒' % (end - start))  #輸出下載用時時間
    except:

現原理其實很簡單,我們一般下載東西使用的requests.get(url).content的方法下載來的文件是二進制文件,我們只要通過for循環每次下載1024kb,到最后獲取文件的總大小,即可完成我們的功能實現了!.

參考文獻

https://blog.csdn.net/m0_46778548/article/details/121180585

https://blog.csdn.net/weixin_43347550/article/details/105248223

原文鏈接:https://blog.csdn.net/weixin_35770067/article/details/127623920

欄目分類
最近更新