Python實現向s3共享存儲上傳和下載文件

博客原文
安利一篇我翻譯的國外大牛的神經網絡入門文章

主要是使用boto模塊

建立連接

import boto
import boto.s3.connection
from boto.s3.key import Key

conn = boto.connect_s3(
            aws_access_key_id = 'xxxxxxx',
            aws_secret_access_key = 'xxxxxxxx',
            host = 's3.xxxxx.com', is_secure = False,
            calling_format = boto.s3.connection.OrdinaryCallingFormat())

創建/獲取bucket

bucket = conn.create_bucket('test')  ----創建一個新的bucket
# bucket = conn.get_bucket('test')   ----獲取一個已經存在的bucket
k = Key(bucket)
k.key = 'test_file'

將文件內容上傳到共享存儲

filename = 'testfile'
k.set_contents_from_filename(filename)

將共享存儲的內容存到文件

filename2 = 'testfile2'
k.get_contents_to_filename(filename2)

刪除key/bucket

bucket.delete_key('test_file')
conn.delete_bucket(bucket.name)

上面介紹的是使用boto2模塊,但現在官方推薦使用boto3,boto3提供了更高層的抽象(resource)。這使得很多操作變的更便捷,可以參考官方文檔的介紹,對於一些可能遇到的坑這裏提下

boto3使用中可能遇到問題

1. 使用resource層級的接口,如何上傳一段內存內容

這個目前我還沒找到方法,官方意思是提供一個filelike-obj的就可以,但是需要這個filelike-obj提供read方法,貌似文件的read方法沒那麼好模擬,我簡單寫了一個類,return一個bytes,結果在使用中,調用的時候直接死循環了。所以這裏還是使用boto3提供的client這一層的接口吧。

class PersisDb(object):
    def __init__(self, *args, **kargs):
        self.s3 = boto3.resource('s3', *args, **kargs)
        self.bkt = kargs.get('s3_bucket', 'test')
        self.client = boto3.client('s3', *args, **kargs)

    def insert(self, user_id, date, doc):
        bkt = self.bkt
        key = '{user_id}/{date}'.format(user_id=user_id, date=date)
        LOG.debug('writing doc to %s:%s' % (bkt, key))
        self.client.put_object(Bucket=bkt, Key=key, Body=doc)

2. 使用resource層級接口,如何下載一個文件到內存

這個還是可以實現的,就是用StringIO這個類型來做filelike-object

    def select(self, user_id, date):
        bkt = self.bkt
        key = '{user_id}/{date}'.format(user_id=user_id, date=date)
        f = StringIO.StringIO()
        self.s3.Bucket(bkt).download_fileobj(key, f)
        return f.getvalue()

另外這裏說一點,採用s3作爲後端存儲,系統設計時候需要注意的是bucket數量不能太多(<100),key這一層可以認爲沒有限制。s3的存儲很像文件系統,bucket可以抽象爲一個物理設備,而key則構成了設備上的目錄(採用aws s3 ls命令也可以很明顯的發現這一點)
看完支付寶掃個紅包吧 :)

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