Abra o objeto S3 como uma string com o Boto3

150

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?

Gahl Levy
fonte
8
I significava escolher uma resposta final, de preferência mina;)
EvgenyKolyakov

Respostas:

228

readretornará 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') 
Kamil Sindi
fonte
1
para obter essa resposta para o trabalho, eu tive que import botocorecomo obj.get()['Body']é do tipo<class 'botocore.response.StreamingBody'>
Tzunghsing David Wong
1
@TzunghsingDavidWong, você não precisa importar um pacote para chamar métodos em um objeto existente, certo? Talvez isso fosse apenas necessário durante as experiências?
Ken Williams
1
qual é o valor da chave no obj = s3.Object (bucket, key) ** bucket is buckername ?? ea chave é o nome do arquivo ??? *** por favor, corrija-me se estou errado ...
Amaresh Jana
1
@Amaresh sim, bucket = nome e chave do bucket = nome do arquivo
Tipster
se uma chave está no formato pdf, funciona? ou por favor sugerir uma outra maneira útil, eu tentei importação textract text = textract.process ( 'path / to / a.pdf', method = 'pdfminer') Ele vai semear erro de importação
Arun Kumar
96

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. bytesSe você deseja obter uma string, deve usar:

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

EvgenyKolyakov
fonte
18
Trabalhou para mim! Documentação AWS Boto3 é uma bagunça
Timo
76

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

Gahl Levy
fonte
1
assumindo que "Body" contém dados de string, você pode usar object.get () ["Body"]. read () para converter em uma string Python.
roehrijn
28
boto3 obtém um documento terrível, a partir de 2016.
Andrew_1510
3
boto3.readthedocs.io/en/latest/reference/services/… nos diz que o valor de retorno é um ditado, com uma chave "Body" do tipo StreamingBody, procurando por isso em read the docs para botocore.readthedocs.io/ en / latest / reference / response.html, que diz para você usar read ().
Jeffrey
3
Parece que agora get expected at least 1 arguments, got 0. Remova get()e acesse a propriedade de objeto "Corpo" diretamente
lurscher 13/12/18
13

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
Gatsby Lee
fonte
-5

Se body contiver um io.StringIO, você deverá fazer o seguinte:

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