python 数据下载+下载进度条

1. 实例

# -*- coding:utf-8 -*- 
import sys
import requests
import os

# 屏蔽warning信息,因为下面verify=False会报警告信息
requests.packages.urllib3.disable_warnings()

def download(url, file_path):
    # verify=False 这一句是为了有的网站证书问题,为True会报错
    # stream = True,表示采用流下载
    r = requests.get(url, stream=True, verify=False)
    
    # 既然要实现下载进度,那就要知道你文件大小啊,下面这句就是得到总大小
    total_size = int(r.headers['Content-Length'])
    temp_size = 0

    with open(file_path, "w") as f:
        # iter_content()函数就是得到文件的内容,
        # 有些人下载文件很大怎么办,内存都装不下怎么办?
        # 那就要指定chunk_size=1024,大小自己设置,
        # 意思是下载一点写一点到磁盘。
        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)
                # 调用标准输出刷新命令行,看到\r回车符了吧
                # 相当于把每一行重新刷新一遍
                sys.stdout.write("\r[%s%s] %d%%" % ('█' * done, ' ' * (50 - done), 100 * temp_size / total_size))
                sys.stdout.flush()
    print()  # 避免上面\r 回车符,执行完后需要换行了,不然都在一行显示

if __name__ == '__main__':
    # path是下载文件保存的路径
    path = r'alias.txt.gz'
    # url是文件网址链接
    url = "https://stringdb-static.org/download/protein.aliases.v11.0/9606.protein.aliases.v11.0.txt.gz"
    # 调用上面下载函数即可
    download(url, path)

2. 解释

  • requests库函数:调用requests库函数时,默认verify=True。但当你的浏览器和网站SSL不匹配时,会报错。此时,可将verify=False。

  • 下载进度:一般网页的Content-Length 包含下载文件总大小,temp_size += len(chunk) 可获得每次本地已经下载的文件大小,实现下载进度(百分比)。

  • 实时刷新:调用标准输出刷新命令行,其中 \r 回车符,相当于每次循环回车到命令行首,把每一行重新刷新一遍,实现动态下载进度条。

  • 下载文件过大:

  • 流下载:当流下载时,用Response.iter_content或许更方便些。requests.get(url)默认是下载在内存中的,下载完成才存到硬盘上,可以用Response.iter_content来边下载边存硬盘
  • 边下载边保存:可指定chunk_size = 1024,具体大小可以自己设置, 意思是下载一点chunk 就写一点到磁盘(避免文件过大,内存崩溃)。

猜你喜欢

转载自blog.csdn.net/nixiang_888/article/details/109109663