Python實現斷點續傳下載文件,大文件下載還怕下載到一半就斷了嗎?不存在!

這篇博客簡單介紹python斷點續傳下載文件,並加入花哨的下載進度顯示方法,涉及Python文件操作的技巧,和一些函數庫的使用。

環境

Python 3.6
requests模塊
對應文件的下載鏈接 (要下載的文件必須支持斷點續傳
(是不是很少東西?那必須,python就是這麼強大!)

乾貨

下面直接上代碼,關鍵是簡單易懂,複製就能用,拿走不謝。

import sys
import requests
import os

# 屏蔽warning信息
requests.packages.urllib3.disable_warnings()

def download(url, file_path):
    # 第一次請求是爲了得到文件總大小
    r1 = requests.get(url, stream=True, verify=False)
    total_size = int(r1.headers['Content-Length'])

    # 這重要了,先看看本地文件下載了多少
    if os.path.exists(file_path):
        temp_size = os.path.getsize(file_path)  # 本地已經下載的文件大小
    else:
        temp_size = 0
    # 顯示一下下載了多少   
    print(temp_size)
    print(total_size)
    # 核心部分,這個是請求下載時,從本地文件已經下載過的後面下載
    headers = {'Range': 'bytes=%d-' % temp_size}  
    # 重新請求網址,加入新的請求頭的
    r = requests.get(url, stream=True, verify=False, headers=headers)

    # 下面寫入文件也要注意,看到"ab"了嗎?
    # "ab"表示追加形式寫入文件
    with open(file_path, "ab") as f:
        for chunk in r.iter_content(chunk_size=1024):
            if chunk:
                temp_size += len(chunk)
                f.write(chunk)
                f.flush()

                ###這是下載實現進度顯示####
                done = int(50 * temp_size / total_size)
                sys.stdout.write("\r[%s%s] %d%%" % ('█' * done, ' ' * (50 - done), 100 * temp_size / total_size))
                sys.stdout.flush()
    print()  # 避免上面\r 回車符


if __name__ == '__main__':
    link = r'https://api.gdc.cancer.gov/data/'
    UUID = r'2a4a3044-0b1a-4722-83ed-43ba5d6d25b0'
    path = r'F:\SYY\temp\a.txt'
    url = os.path.join(link, UUID)
    # 調用一下函數試試
    download(url, path)

相關博客鏈接:https://blog.csdn.net/qq_35203425/article/details/80987451
代碼和上面一篇博客很相似,只不過加入了斷點續傳,所有的代碼解釋也都能在前面那篇博客找到。

下面演示一遍:
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章