example cli aws python amazon-s3 boto boto3

python - cli - Abra el objeto S3 como una cadena con Boto3



boto3 python upload to s3 (5)

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?



Python3 + 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.

import io import boto3 client = boto3.client(''s3'') bytes_buffer = io.BytesIO() client.download_fileobj(Bucket=bucket_name, Key=object_key, Fileobj=bytes_buffer) byte_value = bytes_buffer.getvalue() str_value = byte_value.decode() #python3, default decoding is utf-8


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

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


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

Agregué json al ejemplo para mostrar que se volvió 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, por lo que no necesito .decode(''utf-8'')

NOTA (para python 3.6+): Nos mudamos 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''))


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'')