Sono consapevole che con Boto 2 è possibile aprire un oggetto S3 come stringa con: get_contents_as_string()
Esiste una funzione equivalente in boto3?
Sono consapevole che con Boto 2 è possibile aprire un oggetto S3 come stringa con: get_contents_as_string()
Esiste una funzione equivalente in boto3?
Risposte:
read
restituirà 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')
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 bytes
quindi se vuoi estrarne una stringa, devi usare:
j = json.loads(obj['Body'].read().decode('utf-8'))
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
get expected at least 1 arguments, got 0
. Rimuovere get()
e accedere direttamente alla proprietà dell'oggetto "Corpo"
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
Se body contiene un io.StringIO, devi fare come di seguito:
object.get()['Body'].getvalue()
import botocore
, comeobj.get()['Body']
è di tipo<class 'botocore.response.StreamingBody'>