Abrir el objeto S3 como una cadena con Boto3

Soy consciente de que con Boto 2 es posible abrir un objeto S3 como una cadena con:

get_contents_as_string () http://boto.readthedocs.org/en/latest/ref/file.html?highlight=contents%20string#boto.file.key.Key.get_contents_as_string

¿Hay una función equivalente en boto3?

read devolverá los bytes. Al menos para Python 3, si desea devolver una cadena, tiene que decodificar usando la encoding correcta:

 import boto3 s3 = boto3.resource('s3') obj = s3.Object(bucket, key) obj.get()['Body'].read().decode('utf-8') 

Esto no está en la documentación de boto3. Esto funcionó para mí:

 object.get()["Body"].read() 

el objeto es un objeto s3: http://boto3.readthedocs.org/en/latest/reference/services/s3.html#object

Tuve un problema para leer / analizar el objeto desde S3 debido a que .get() usa Python 2.7 dentro de un AWS Lambda.

Agregué json al ejemplo para mostrar que se convirtió en parsable 🙂

 import boto3 import json s3 = boto3.client('s3') obj = s3.get_object(Bucket=bucket, Key=key) j = json.loads(obj['Body'].read()) 

NOTA (para python 2.7): Mi objeto es todo ascii, así que no necesito .decode('utf-8')

NOTA (para python 3.6+): Nos movimos a python 3.6 y descubrimos que read() ahora devuelve bytes por lo que si desea obtener una cadena, debe usar:

j = json.loads(obj['Body'].read().decode('utf-8'))

Si el cuerpo contiene un io.StringIO, debes hacer lo siguiente:

 object.get()['Body'].getvalue()