Pregunta Abra 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?


73
2017-08-12 22:10


origen


Respuestas:


read devolverá bytes. Al menos para Python 3, si desea devolver una cadena, debe decodificar usando la codificación correcta:

import boto3

s3 = boto3.resource('s3')

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

107
2018-02-13 04:41



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

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

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


62
2017-08-12 23:07



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

Agregué json al ejemplo para mostrar que pasó a ser analizable :)

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 regresa bytes así que si quieres obtener una cadena de él, debes usar:

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


24
2018-03-11 15:52



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

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

-2
2017-11-30 10:02