Soy consciente de que con Boto 2 es posible abrir un objeto S3 como una cadena con: get_contents_as_string()
¿Hay una función equivalente en boto3?
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')
import botocore
comoobj.get()['Body']
es de tipo<class 'botocore.response.StreamingBody'>
Tuve un problema para leer / analizar el objeto desde S3 debido al
.get()
uso de Python 2.7 dentro de un AWS Lambda.Agregué json al ejemplo para mostrar que se volvió analizable :)
NOTA (para python 2.7): mi objeto es todo ascii, por lo que no necesito
.decode('utf-8')
NOTA (para Python 3.6+): Nos mudamos a Python 3.6 y descubrimos que
read()
ahora regresa,bytes
por lo que si desea obtener una cadena, debe usar:j = json.loads(obj['Body'].read().decode('utf-8'))
fuente
Esto no está en la documentación de boto3. Esto funcionó para mí:
objeto siendo un objeto s3: http://boto3.readthedocs.org/en/latest/reference/services/s3.html#object
fuente
get expected at least 1 arguments, got 0
. Eliminarget()
y acceder a la propiedad del objeto "Cuerpo" directamentePython3 + Usando el enfoque API de boto3.
Al usar la API S3.Client.download_fileobj y el objeto similar a un archivo Python , el contenido del Objeto S3 se puede recuperar en la memoria.
Dado que el contenido recuperado es bytes, para convertir a str , debe decodificarse.
fuente
Si el cuerpo contiene un io.StringIO, debe hacer lo siguiente:
fuente