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'))
s3.Object().put()
termino con un objeto con cerocontent-length
. Para mí,put()
solo acepta datos de cadena, peroput(str(binarydata))
parece tener algún tipo de problemas de codificación. Termino con un objeto aproximadamente 3 veces el tamaño de los datos originales, lo que lo hace inútil para mí.boto3 también tiene un método para cargar un archivo directamente:
http://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Bucket.upload_file
fuente
s3.Bucket(...).upload_fileobj()
método en su lugar.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 de S3 con contenido de cadena:
fuente
prefix
en este caso? Es decir, ¿qué pasa si desea almacenar el archivomy-bucket-name/subfolder/
?Aquí hay un buen truco para leer JSON desde s3:
Ahora puede usar
json.load_s3
yjson.dump_s3
con la misma API queload
ydump
fuente
...["Body"].read().decode('utf-8')
.Una versión más limpia y concisa que utilizo para cargar archivos sobre la marcha a un determinado depósito y subcarpeta de S3.
Nota : SIEMPRE debe poner sus credenciales de AWS (
aws_access_key_id
yaws_secret_access_key
) en un archivo separado, por ejemplo:~/.aws/credentials
fuente
~
C:\Users\username\.aws\credentials
Vale la pena mencionar smart-open que se usa
boto3
como back-end.smart-open
es un reemplazo directo para pythonopen
que puede abrir archivos desdes3
, así comoftp
,http
y muchos otros protocolos.por ejemplo
Las credenciales de aws se cargan a través de las credenciales de boto3 , generalmente un archivo en el
~/.aws/
directorio o una variable de entorno.fuente
Puede usar el siguiente código para escribir, por ejemplo, una imagen en S3 en 2019. Para poder conectarse a S3, tendrá que instalar AWS CLI usando el comando
pip install awscli
, luego ingrese algunas credenciales usando el comandoaws configure
:fuente