使用python批量下载七牛云里的图片
最近我在整理我拍的照片,我的照片全都存在了七牛云里,数量比较多,如果我要一个个从网页上下载比较麻烦,所以我就学习了一下七牛云官方网站提供的SDK和api接口,发现用七牛SDK批量下载比较麻烦,所以我自己想出了一种好办法。
办法挺简单,就是先用七牛的python版sdk获取图片文件列表,之后再用requests库下载,同时优化了下载进度显示,改进了一位大哥的进度条显示代码,用以观察下载进度。
1. 七牛云SDK安装使用
安装挺简单,就是pip一下。
pip install qiniu
使用如官网文档所示,https://developer.qiniu.com/kodo/sdk/1242/python
用sdk获取完图片文件列表之后,先用json.dumps()格式化输出一遍获取的json串,再用JsonPath提取里面的图片文件名称。具体实例代码如下。
import sys
from urllib.parse import urlsplit
import requests
from qiniu import Auth, BucketManager
import qiniu.config
import json
import jsonpath
# 七牛的秘钥对
access_key = 'xxxxx-dddgffghdxxxxxxxx-dddd'
secret_key = 'xxxxxx-xxxxxxxxxxxxxxxxxxxxxxx'
# 存储空间的名称
bucket_name = 'xxxxxxx'
q = Auth(access_key, secret_key)
bucket = BucketManager(q)
# 前缀
prefix = ['blog']
# 列举条目
limit = 1000
# 列举出除'/'的所有文件以及以'/'为分隔的所有前缀
delimiter = None
# 标记
marker = None
ret, eof, info = bucket.list(bucket_name, prefix, marker, limit, delimiter)
# 格式化获取的Json文件列表
print(json.dumps(ret, sort_keys=True, indent=2))
# 使用JsonPath提取图片文件名称
images_keys = jsonpath.jsonpath(ret, '$..key')
# 显示图片数量
print(len(images_keys))
执行截图:
2. 显示下载图片进度
有了文件列表,剩下的就是拼接url下载图片了,在下载图片之前我们还得写个展示进度的方法,因为图片比较大,所以要显示出文件的大小,已经下载的大小,下载进度的百分比及进度条。
代码如下,我是改进了一个别人写好的现成的方法。
def download_progressbar(file_url, base_path):
'''
下载文件及进度显示
:param file_url: 文件url
:param base_path: 本地目录,用于保存文件
:return:
'''
response = requests.get(file_url, stream=True, verify=False)
# 获取文件大小
total_size = int(response.headers['Content-Length'])
temp_size = 0
with open(base_path + urlsplit(file_url).path, "wb") as f:
# 每次写入大小,文件较大时,防止内存不足,分次写入
for chunk in response.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%d:%d [%s%s] %d%%" % (
total_size, temp_size, '█' * done, ' ' * (50 - done), 100 * temp_size / total_size))
sys.stdout.flush()
print()
执行下载代码
base_imageUrl = r'http://qn.xxxxxx.xxxxx/'
base_save = r'e:\\Qiniu'
for p in images_keys:
image_ulr = base_imageUrl+p
print(p)
download_progressbar(image_ulr,base_save)
执行效果动态图
进度条效果截图