zoukankan      html  css  js  c++  java
  • 基于七牛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:	"+key
            except:
                print "error down:	"+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代码区显示不友好,可以到我的个人博客中浏览

  • 相关阅读:
    completable 用法
    spring 纯注解方式 与AOP
    springIOC原理加载过程
    多线程手写Future模式
    springMVC 实现redis分布式锁
    java线程池学习
    本地跑 spark ui 报错
    九度oj 题目1452:搬寝室
    九度oj 题目1456:胜利大逃亡
    九度oj 题目1455:珍惜现在,感恩生活
  • 原文地址:https://www.cnblogs.com/shizioo/p/4764646.html
Copyright © 2011-2022 走看看