web-dev-qa-db-ja.com

boto3を使ってファイルやデータをS3オブジェクトに書く方法

Boto 2では、これらのメソッドを使ってS3オブジェクトに書くことができます:

ボト3相当はありますか? S3に保存されているオブジェクトにデータを保存するためのboto3メソッドは何ですか?

55
jkdev

Boto 3では、 'Key.set_contents_from_'メソッドは次のように置き換えられました。

例えば:

import boto3

some_binary_data = b'Here we have some data'
more_binary_data = b'Here we have some more data'

# Method 1: Object.put()
s3 = boto3.resource('s3')
object = s3.Object('my_bucket_name', 'my/key/including/filename.txt')
object.put(Body=some_binary_data)

# Method 2: Client.put_object()
client = boto3.client('s3')
client.put_object(Body=more_binary_data, Bucket='my_bucket_name', Key='my/key/including/anotherfilename.txt')

あるいは、バイナリデータは、 boto 2とboto 3を比較した公式文書 :で説明されているように、ファイルの読み取りから取得することもできます。

データを保存する

ファイル、ストリーム、または文字列からデータを格納するのは簡単です。

# Boto 2.x
from boto.s3.key import Key
key = Key('hello.txt')
key.set_contents_from_file('/tmp/hello.txt')

# Boto 3
s3.Object('mybucket', 'hello.txt').put(Body=open('/tmp/hello.txt', 'rb'))
116
jkdev

boto3にはファイルを直接アップロードする方法もあります。

s3.Bucket('bucketname').upload_file('/local/file/here.txt','folder/sub/path/to/s3key')

http://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Bucket.upload_file

27
EM Bee

これは、s3からJSONを読むためのいいトリックです。

import json, boto3
s3 = boto3.resource("s3").Bucket("bucket")
json.load_s3 = lambda f: json.load(s3.Object(key=f).get()["Body"])
json.dump_s3 = lambda obj, f: s3.Object(key=f).put(Body=json.dumps(obj))

これで、loadおよびdumpと同じAPIでjson.load_s3およびjson.dump_s3を使用できるようになりました

data = {"test":0}
json.dump_s3(data, "key") # saves json to s3://bucket/key
data = json.load_s3("key") # read json from s3://bucket/key
20
Uri Goren

S3でファイルに書き込む前に内容をバイナリに変換する必要はもうありません。次の例では、文字列の内容を含む新しいテキストファイル(newfile.txt)をS3バケットに作成します。

import boto3

s3 = boto3.resource(
    's3',
    region_name='us-east-1',
    aws_access_key_id=KEY_ID,
    aws_secret_access_key=ACCESS_KEY
)
content="String content to write to a new S3 file"
s3.Object('my-bucket-name', 'newfile.txt').put(Body=content)
9
Franke

特定のS3バケットとサブフォルダにファイルをその場でアップロードするために使用する、よりクリーンで簡潔なバージョン -

import boto3

BUCKET_NAME = 'sample_bucket_name'
PREFIX = 'sub-folder/'

s3 = boto3.resource('s3')

# Creating an empty file called "_DONE" and putting it in the S3 bucket
s3.Object(BUCKET_NAME, PREFIX + '_DONE').put(Body="")

:必ずAWS認証情報(aws_access_key_idaws_secret_access_key)をaに入れてください。別のファイル、例えば - ~/.aws/credentials

2
kev