开发者社区> 问答> 正文

一个将S3上的所有数据导入阿里云开放存储的python代码


写了一个将S3上的所有数据导入阿里云开放存储的python代码,给大家抛砖引玉了!
这段代码运行需要boto和OSS的python SDK(资源链接网站不让新手贴,大家网上搜搜吧!)。
大家运行前,填好自己在s3和oss上的ID和KEY就好了。


#-*-coding:utf-8-*-
"""
Author: 22742545@qq.com
Version: 0.1
功能描述:将Amazon S3上的数据导入到阿里云开放存储(OSS)
功能细节:
1. 依赖OSS官方提供的pythonS3的boto库,以及
2. 创建S3上同名的bucket,如果在OSS上遇到重名冲突,会交互式提示改bucket名称
2. Copy Object的时候,会使用S3上相同的content-type
3. 想单独从S3复制一个bucket到OSS上,可以直接使用move_bucket函数
依赖环境:
1. Amazon S3的boto开发包
2. OSS的官方python SDK
TODO:
1. 没有处理网络异常,使用者网速慢时会有异常
2. Object的Header只复制了content-type,其他的Header(包括user-header)并未复制
3. 每次复制只能从头开始,不提供断点续传
4. 所有文件缓存操作都在内存中进行,没考虑超大文件情况
"""
from oss_api import *
from oss_xml_handler import *
import boto
from boto.s3.key import Key
s3_id = "< 填入你S3的ID>"
s3_key = "< 填入你S3的Secret Key>"
oss_id = "< 填入你OSS的ID>"
oss_key = "< 填入你OSS的Secret Key>"
#Create two connections of S3 and OSS
s3_conn = boto.connect_s3(s3_id, s3_key)
oss_conn = OssAPI("storage.aliyun.com", oss_id, oss_key)
"""
从S3上复制一个bucket的所有数据到OSS
"""
def move_bucket(s3_bucket_name, oss_bucket_name):
    s3_bucket =  s3_conn.get_bucket(s3_bucket_name)
    key_list = s3_bucket.get_all_keys()
    print "  Move the s3 bucket (%s) to oss bucket (%s), there are %s files in this bucket." % (s3_bucket_name, oss_bucket_name, len(key_list))
    for key in key_list:
        object = s3_bucket.get_key(key.name)
        print "    Moving object: %s (size: %s, content-type: %s)" % (object.name, object.size, object.content_type)
        oss_conn.put_object_with_data(oss_bucket_name, key.name, object.read(object.size), object.content_type)
    print "  Move bucket %s finish!" % s3_bucket_name
    print "========================================================="


def main():
    print "Step 1. Get your bucket list from s3."
    s3_res = s3_conn.get_all_buckets()
    print "Your bucket list:"
    for bucket in s3_res:
        print "  ", bucket.name
    print "\nStep 2. Create the oss buckets and move the objects."
    print "========================================================="
    for bucket in s3_res:
        name = bucket.name
        while True:
            print "  Create the oss bucket:", name
            oss_res = oss_conn.create_bucket(name)
            if 200 != oss_res.status:
                val = raw_input("  Create oss bucket failed. Do you want to change the bucket name (Y/N)?")
                if val == "y" or val == "Y":
                    name = raw_input("  Input new oss bucket name:")
                else:
                    break;
            else:
                break
        move_bucket(bucket.name, name)


if __name__ == '__main__':
    main()







展开
收起
irecoffee 2011-11-23 16:33:10 21879 0
1 条回答
写回答
取消 提交回答
  • 赞!试用了一下,work!
    2011-11-23 16:51:11
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
From Python Scikit-Learn to Sc 立即下载
Data Pre-Processing in Python: 立即下载
双剑合璧-Python和大数据计算平台的结合 立即下载