Estou ciente de que, com o Boto 2, é possível abrir um objeto S3 como uma string com: get_contents_as_string()
Existe uma função equivalente no boto3?
Estou ciente de que, com o Boto 2, é possível abrir um objeto S3 como uma string com: get_contents_as_string()
Existe uma função equivalente no boto3?
Respostas:
read
retornará bytes. Pelo menos para Python 3, se você quiser retornar uma string, precisará decodificar usando a codificação correta:
import boto3
s3 = boto3.resource('s3')
obj = s3.Object(bucket, key)
obj.get()['Body'].read().decode('utf-8')
import botocore
como obj.get()['Body']
é do tipo<class 'botocore.response.StreamingBody'>
Ocorreu um problema ao ler / analisar o objeto do S3 devido ao .get()
uso do Python 2.7 dentro de um AWS Lambda.
Eu adicionei json ao exemplo para mostrar que se tornou 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): Meu objeto é todo ascii, então não preciso .decode('utf-8')
OBSERVAÇÃO (para python 3.6+): passamos para o python 3.6 e descobrimos que read()
agora retorna. bytes
Se você deseja obter uma string, deve usar:
j = json.loads(obj['Body'].read().decode('utf-8'))
Isso não está na documentação do boto3. Isso funcionou para mim:
object.get()["Body"].read()
objeto sendo um objeto s3: http://boto3.readthedocs.org/en/latest/reference/services/s3.html#object
get expected at least 1 arguments, got 0
. Remova get()
e acesse a propriedade de objeto "Corpo" diretamente
Python3 + Usando a abordagem da API boto3.
Usando a API S3.Client.download_fileobj e o objeto semelhante a arquivo Python , o conteúdo do objeto S3 pode ser recuperado na memória.
Como o conteúdo recuperado é de bytes, para converter em str , ele precisa ser decodificado.
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
Se body contiver um io.StringIO, você deverá fazer o seguinte:
object.get()['Body'].getvalue()