python 遍歷oss 實現批次下載

clamshine發表於2016-12-01
    oss儲存有很多批次上傳的文  = = 然後現在是由於程式主動刪除了oss的檔案,阿里是不給恢復的,所以想要把檔案備份到本地 。
    阿里的oss是key-values形式的儲存,沒有資料夾的概念,也是就是說test/007.jpg實際上是兩個檔案 一個叫做test/的空檔案和一個叫做test/007.jpg 的檔案
    看了ossfs osscmd 都可以實現批次下載,然後ossfs掛載上去對其操作都是在oss端的操作,後者 還沒用。
  故此,自己寫了個很爛的程式碼。先暫時滿足下需求。囧 ,不行的話還是採用osscmd多執行緒支援斷電續傳吧 囧。沒辦法 渣呀。。。。。。。
直接貼了 。。。還有 模組記得安裝 pip install oss2
#coding:utf-8
from __future__ import print_function
import os,sys
import oss2
from itertools import islice
import urllib
import  requests
import re

auth = oss2.Auth('您的AccessKeyId', '您的AccessKeySecret')
bucket = oss2.Bucket(auth, '地區', 'bucket桶名')

def mkdir(path):
    path = path.strip()
    path = path.rstrip("\\")
    isExits = os.path.exists(path)
    if not isExits:
        print(path + "建立成功")
        os.makedirs(path)
        return True
    else:
        print(path+"目錄存在")
        return False

def percentage(consumed_bytes, total_bytes):
    if total_bytes:
        rate = int(100 * (float(consumed_bytes) / float(total_bytes)))
        print('\r{0}% '.format(rate), end='')
        sys.stdout.flush()

for b in islice(oss2.ObjectIterator(bucket),sys.maxsize):
    c = b.key
    if c[-1:] == '/':
        mkdir(c)
    if c[-1:] != '/':
        oss2.resumable_download(bucket, c, c,store=oss2.ResumableDownloadStore(root='/tmp'),multiget_threshold=20*1024*1024,part_size=10*1024*1024,num_threads=3,progress_callback=percentage)
        print(c+"下載完成")

然後 期間建立目錄看的是別人的文件,初學python 只能按別人的程式碼來 TOT。總感覺這樣做太低效了,有其他好點的辦法麼 ,這樣拼拼湊湊的程式碼 不忍直視 囧o(╯□╰)o 。 Python2.6 Python3.4都可以跑。
來自

升級版 : 增量下載 o(╯□╰)o

#coding:utf-8
from __future__ import print_function
import os,sys
import oss2
from itertools import islice
import urllib
import  requests
import re
import time
auth = oss2.Auth('同上', '同上')
bucket = oss2.Bucket(auth, '同上', '同上')

def mkdir(path):
    path = path.strip()
    path = path.rstrip("\\")
    isExits = os.path.exists(path)
    if not isExits:
        print(path + "建立成功")
        os.makedirs(path)
        return True
    else:
        print(path+"目錄已經存在")
        return False

def percentage(consumed_bytes, total_bytes):
    if total_bytes:
        rate = int(100 * (float(consumed_bytes) / float(total_bytes)))
        print('\r{0}% '.format(rate), end='')
        sys.stdout.flush()

filename = time.strftime("%Y-%m-%d-%H%M%S", time.localtime())
for b in islice(oss2.ObjectIterator(bucket),sys.maxsize):
   c = b.key
   if c[-1:] == '/':
        mkdir(c)
   if c[-1:] != '/':
       remote_stream = bucket.get_object(c)
       print(remote_stream.last_modified)
       ticks = time.time()
#       file = open('time.txt','w')
#       file.write(str(ticks))
       file = open('time.txt','r')
       f = file.read()
       k = float(f)
       if remote_stream.last_modified > k:
           oss2.resumable_download(bucket, c, c,store=oss2.ResumableDownloadStore(root='/tmp'),multiget_threshold=20*1024*1024,part_size=10*1024*1024,num_threads=3,progress_callback=percentage)
           
           #filename = time.strftime("%Y-%m-%d-%H%M%S", time.localtime())
           print(filename)
           fileobject = open(filename,'a')
           fileobject.write(str(c))
           #fileobject.close()
           #bucket.get_object_to_file(c,c)

file = open('time.txt','w')
file.write(str(ticks))
file.close()
fileobject.close()

缺點:遍歷 嗯 然後目錄沒有做提取 。然後下載地點就是本地 。之後再改改。哈哈

斷點下載= = 
#coding:utf-8
from __future__ import print_function
import os,sys
import oss2
from itertools import islice
import urllib
import  requests
import re
auth = oss2.Auth('XXX', 'XXX')
bucket = oss2.Bucket(auth, 'XXX', 'XXX')
def mkdir(path):
    path = path.strip()
    path = path.rstrip("\\")
    isExits = os.path.exists(path)
    if not isExits:
        print(path + "建立成功")
        os.makedirs(path)
        return True
    else:
        print(path+"目錄已經存在")
        return False

def percentage(consumed_bytes, total_bytes):
    if total_bytes:
        rate = int(100 * (float(consumed_bytes) / float(total_bytes)))
        print('\r{0}% '.format(rate), end='')
        sys.stdout.flush()
for b in islice(oss2.ObjectIterator(bucket),sys.maxsize):
    c = b.key
    if c[-1:] == '/':
        mkdir('/ossbackup/ossback/'+c)
    else:
        cname = str(c)
        sumnumber = 0
        i = 0
        for line2 in open('downname.txt','r'):
            line1 = str(line2)
            cname2 = str(cname+'\n')
            if cname2 != line1:
                i = i + 0
                sumnumber = i
            else:
                i = i + 1
                sumnumber = i
       # print(sumnumber)
        if sumnumber == 0 :
            downfilename = open('downfilename.txt','w')
            downfilename.write(str(cname))
            print(cname+'is not download')
            downfilename.close()
        else :
            print(cname+' is download')
        downfilename = open('downfilename.txt','r')
        lineend = downfilename.readline()
        oss2.resumable_download(bucket,lineend,'/ossbackup/ossback/'+lineend,store=oss2.ResumableDownloadStore(root='/tmp'),multiget_threshold=20*1024*1024,part_size=10*1024*1024,num_threads=3,progress_callback=percentage)
        print(lineend+"下載完成"+"\n")
        file = open('downname.txt','a')
        file.write(str(lineend)+"\n")






來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30629069/viewspace-2129464/,如需轉載,請註明出處,否則將追究法律責任。

相關文章