sqs - python aws s3 example




Como gravar um arquivo ou dados em um objeto S3 usando boto3 (5)

Aqui está um bom truque para ler JSON da s3:

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))

Agora você pode usar json.load_s3 e json.dump_s3 com a mesma API que load e dump

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

No boto 2, você pode gravar em um objeto S3 usando estes métodos:

Existe um equivalente boto 3? Qual é o método boto3 para salvar dados em um objeto armazenado no S3?


No boto 3, os métodos 'Key.set_contents_from_' foram substituídos por

Por exemplo:

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')

Como alternativa, os dados binários podem vir da leitura de um arquivo, conforme descrito nos documentos oficiais que comparam ooto 2 e ooto 3 :

Armazenando Dados

É fácil armazenar dados de um arquivo, fluxo ou string:

# 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'))

Uma versão mais limpa e concisa que eu uso para fazer upload de arquivos em tempo real para um determinado bucket e subpasta 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="")

Nota : SEMPRE coloque suas credenciais da AWS ( aws_access_key_id e aws_secret_access_key ) em um arquivo separado, por exemplo - ~/.aws/credentials


Você não precisa mais converter o conteúdo em binário antes de gravar no arquivo no S3. O exemplo a seguir cria um novo arquivo de texto (chamado newfile.txt) em um bucket do S3 com o conteúdo da string:

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)

vale mencionar o smart-open que usa o boto3 como back-end.

smart-open é um substituto para o open do python, que pode abrir arquivos do s3 , além de ftp , http e muitos outros protocolos.

por exemplo

 from smart_open import open import json with open("s3://your_bucket/your_key.json", 'r') as f: data = json.load(f) 

As credenciais do aws são carregadas via credenciais boto3 , geralmente um arquivo no ~/.aws/ dir ou uma variável de ambiente.





boto3