Abra o objeto S3 como uma string com o Boto3


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

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


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


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

-5

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

object.get()['Body'].getvalue()
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.