基于七牛Python SDK写的一个批量下载脚本

前言

上一篇基于七牛Python SDK写的一个同步脚本所写的脚本只支持上传,不支持文件下载。
虽然这个需求不太强烈,但有可能有人(在备份、迁移时)需要,而官方有没提供对应的工具,所以我就把这个功能也加上。

实现

下载脚本的核心逻辑

(博客园的markdown代码区显示不友好,可以到我的个人博客中浏览)

#!/usr/bin/env python
#-*- coding:utf-8 -*-
# 
# AUTHOR = "heqingpan"
# AUTHOR_EMAIL = "heqingpan@126.com"
# URL = "http://git.oschina.net/hqp/qiniu_sync"

import qiniu
from qiniu import Auth
from qiniu import BucketManager
import os
import re
import urllib2
import sys

access_key = ''
secret_key = ''
bucket_name = ''
bucket_domain = ''

q = Auth(access_key, secret_key)
bucket = BucketManager(q)
basedir=os.path.realpath(os.path.dirname(__file__))
#同步目录
#basedir=""
filename=__file__
ignore_paths=[filename,"{0}c".format(filename)]
ignore_names=[".DS_Store",".git",".gitignore"]
charset="utf8"
diff_time=2*60


def list_all(bucket_name, bucket=None, prefix="", limit=100):
    rlist=[]
    if bucket is None:
        bucket = BucketManager(q)
    marker = None
    eof = False
    while eof is False:
        ret, eof, info = bucket.list(bucket_name, prefix=prefix, marker=marker, limit=limit)
        marker = ret.get('marker', None)
        for item in ret['items']:
            rlist.append(item["key"])
    if eof is not True:
        # 错误处理
        #print "error"
        pass
    return rlist

def down_file(key,basedir="",is_private=1,expires=3600):
    if isinstance(key,unicode):
        key=key.encode(charset)
    url = 'http://%s/%s' % (bucket_domain, key)
    if is_private:
        url=q.private_download_url(url, expires=expires)
    c=urllib2.urlopen(url)
    fpath=key.replace("/",os.sep)
    savepath=os.path.join(basedir,fpath)
    dir_=os.path.dirname(savepath)
    if not os.path.isdir(dir_):
        os.makedirs(dir_)
    elif os.path.isfile(savepath):
        os.remove(savepath)
    f = file(savepath, 'wb')
    f.write(c.read())
    f.close()

def down_all(prefix=""):
    import traceback
    for key in list_all(bucket_name,bucket,prefix=prefix):
        try:
            down_file(key,basedir=basedir)
            print "down:\t"+key
        except:
            print "error down:\t"+key
            print traceback.format_exc()
    print "down end"

def main():
    if len(sys.argv)>1:
        if sys.argv[1]=="down":
            prefix=len(sys.argv)>2 and sys.argv[2] or ""
            down_all(prefix=prefix)
            return

if __name__=="__main__":
    main()

使用方式

  • 安装七牛Python SDK
    pip install qiniu

  • 填写脚本文件(qiniusync.py)的配置信息

access_key = ''
secret_key = ''
bucket_name = ''
bucket_domain = ''

注册后可以拿到对应的信息

  • 将脚本文件(qiniusync.py)拷贝到待同步根目录

  • 运行脚本

python qiniusync.py down
python qiniusync.py down [文件路径前缀]

后记

我已经将下载的脚本与同步脚本整合在一起,放到GitOSCgithub上。
至此该脚本支持批量下载、同步上传。

博客园的markdown代码区显示不友好,可以到我的个人博客中浏览

posted @ 2015-08-27 21:12  拾玄  阅读(679)  评论(0编辑  收藏  举报