create - boto3 python upload to s3
Cómo escribir un archivo o datos en un objeto S3 usando boto3 (5)
Aquí hay un buen truco para leer JSON desde 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))
Ahora puede usar
json.load_s3
y
json.dump_s3
con la misma API que
load
and
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
En el boto 2, puede escribir en un objeto S3 utilizando estos métodos:
- Key.set_contents_from_string()
- Key.set_contents_from_file()
- Key.set_contents_from_filename()
- Key.set_contents_from_stream()
¿Hay un boto 3 equivalente? ¿Cuál es el método boto3 para guardar datos en un objeto almacenado en S3?
En el boto 3, los métodos ''Key.set_contents_from_'' fueron reemplazados por
Por ejemplo:
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'')
Alternativamente, los datos binarios pueden provenir de la lectura de un archivo, como se describe en los documentos oficiales que comparan boto 2 y boto 3 :
Almacenamiento de datos
Almacenar datos de un archivo, secuencia o cadena es fácil:
# 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''))
Una versión más limpia y concisa que utilizo para cargar archivos sobre la marcha a un cubo y subcarpeta S3 dado
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
: SIEMPRE debe colocar sus credenciales de AWS (
aws_access_key_id
y
aws_secret_access_key
) en un archivo separado, por ejemplo-
~/.aws/credentials
Ya no tiene que convertir el contenido a binario antes de escribir en el archivo en S3. El siguiente ejemplo crea un nuevo archivo de texto (llamado newfile.txt) en un depósito S3 con contenido de cadena:
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)
boto3 también tiene un método para cargar un archivo directamente:
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