博客原文
安利一篇我翻譯的國外大牛的神經網絡入門文章
主要是使用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命令也可以很明顯的發現這一點)
看完支付寶掃個紅包吧 :)