Apri l'oggetto S3 come stringa con Boto3


Risposte:


228

readrestituirà byte. Almeno per Python 3, se vuoi restituire una stringa, devi decodificare usando la codifica corretta:

import boto3

s3 = boto3.resource('s3')

obj = s3.Object(bucket, key)
obj.get()['Body'].read().decode('utf-8') 

1
per ottenere questa risposta al lavoro, ho dovuto import botocore, come obj.get()['Body']è di tipo<class 'botocore.response.StreamingBody'>
Tzunghsing David Wong

1
@TzunghsingDavidWong non dovresti importare un pacchetto per chiamare metodi su un oggetto esistente, giusto? È stato forse necessario solo durante la sperimentazione?
Ken Williams,

1
qual è il valore della chiave nell'obj = s3.Object (bucket, chiave) ** bucket è buckername ?? e chiave è il nome del file ??? *** per favore correggimi se sbaglio ...
Amaresh Jana,

1
@Amaresh sì, bucket = nome e chiave del bucket = nome file
Tipster

se una chiave è in formato pdf, funziona? o per favore suggerisci un altro modo utile, ho provato a importare textract text = textract.process ('percorso / to / a.pdf', metodo = 'pdfminer') Seminerà un errore di importazione
Arun Kumar

96

Ho avuto un problema a leggere / analizzare l'oggetto da S3 a causa di .get() dell'utilizzo di Python 2.7 all'interno di una Lambda AWS.

Ho aggiunto JSON all'esempio per mostrare che è diventato analizzabile :)

import boto3
import json

s3 = boto3.client('s3')

obj = s3.get_object(Bucket=bucket, Key=key)
j = json.loads(obj['Body'].read())

NOTA (per Python 2.7): il mio oggetto è tutto ASCII, quindi non ne ho bisogno .decode('utf-8')

NOTA (per python 3.6+): siamo passati a python 3.6 e abbiamo scoperto che read()ora ritorna bytesquindi se vuoi estrarne una stringa, devi usare:

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


18
Ha funzionato per me! La documentazione di AWS Boto3 è un casino
Timo,

76

Questo non è nella documentazione di boto3. Questo ha funzionato per me:

object.get()["Body"].read()

essendo un oggetto s3: http://boto3.readthedocs.org/en/latest/reference/services/s3.html#object


1
supponendo che "Body" contenga dati di stringa, puoi usare object.get () ["Body"]. read () per convertire in una stringa Python.
Roehrijn,

28
boto3 ottiene un documento terribile, a partire dal 2016.
Andrew_1510,

3
boto3.readthedocs.io/en/latest/reference/services/… ci dice che il valore di ritorno è un dict, con una chiave "Body" di tipo StreamingBody, la ricerca di ciò nella lettura dei documenti ti porta a botocore.readthedocs.io/ it / latest / reference / response.html che ti dirà di usare read ().
Jeffrey,

3
sembra che adesso get expected at least 1 arguments, got 0. Rimuovere get()e accedere direttamente alla proprietà dell'oggetto "Corpo"
lurscher,

13

Python3 + Utilizzo dell'approccio API boto3.

Usando l' API S3.Client.download_fileobj e l' oggetto simile a file Python , è possibile recuperare in memoria il contenuto dell'oggetto S3.

Poiché il contenuto recuperato è in byte, per essere convertito in str , è necessario decodificarlo.

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 contiene un io.StringIO, devi fare come di seguito:

object.get()['Body'].getvalue()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.