这篇博客简单介绍python下载文件,并加入花哨的下载进度显示方法,涉及Python文件操作的技巧,和一些函数库的使用。
环境
- Python 3.6
- requests模块
- 对应文件的下载链接
(是不是很少东西?那必须,python就是这么强大!)
干货
下面直接上代码,关键是简单易懂,复制就能用,拿走不谢。
import sys
import requests
import os
# 屏蔽warning信息,因为下面verify=False会报警告信息
requests.packages.urllib3.disable_warnings()
def download(url, file_path):
# verify=False 这一句是为了有的网站证书问题,为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__':
link = r'https://api.gdc.cancer.gov/data/'
UUID = r'2a4a3044-0b1a-4722-83ed-43ba5d6d25b0'
# path是下载文件保存的路径
path = r'F:\SYY\temp\a.txt'
# url是文件网址链接
url = os.path.join(link, UUID)
# 调用上面下载函数即可
download(url, path)
讲解
调用requests库函数时,默认verify=True
,这会导致一个问题,当你的浏览器和网站SSL不匹配时,会报错。那解决办法也非常简单,就是把verify=False
这一句换成上一句。
既然要实现下载进度,那就要知道你要下载文件的总大小,还有你已经下载到的文件大小,那这些信心从哪得到呢?一般网页的Content-Length
就包含下载文件总大小,然后temp_size += len(chunk)
就是得到每次本地已经下载的文件大小,这样就能实现下载进度了(百分比)。
花哨的部分讲解,上面代码中调用标准输出刷新命令行,看到\r回车符了吧,相当于每次循环就回车到命令行首,把每一行重新刷新一遍,所以看起来是动态的下载。
有些人下载文件很大怎么办,内存都装不下怎么办?那就要指定chunk_size = 1024
,具体大小可以自己设置, 意思是下载一点chunk
就写一点到磁盘。又有人问了,那我下载下载就断了,前面那些不是白下了。。。其实这个问题可以用断点续传解决,但是前提是,该网站的文件支持断点续传。断点续传的代码可以看我另一篇文章
。
图片展示
断点续传博客链接:
https://blog.csdn.net/qq_35203425/article/details/80987880