基於七牛Python SDK寫的一個批量下載腳本

前言

上一篇基於七牛Python SDK寫的一個同步腳本所寫的腳本只支持上傳,不支持文件下載。 雖然這個需求不太強烈,但有可能有人(在備份、遷移時)需要,而官方有沒提供對應的工具,所以我就把這個功能也加上。

實現

下載腳本的核心邏輯

(博客園的markdown代碼區顯示不友好,可以到我的個人博客中瀏覽)

#!/usr/bin/env python
#-*- coding:utf-8 -*-
# 
# AUTHOR = "heqingpan"
# AUTHOR_EMAIL = "[email protected]"
# 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代碼區顯示不友好,可以到我的個人博客中瀏覽

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章