Je suis conscient qu'avec Boto 2, il est possible d'ouvrir un objet S3 sous forme de chaîne avec: get_contents_as_string()
Existe-t-il une fonction équivalente dans boto3?
Je suis conscient qu'avec Boto 2, il est possible d'ouvrir un objet S3 sous forme de chaîne avec: get_contents_as_string()
Existe-t-il une fonction équivalente dans boto3?
Réponses:
read
renverra des octets. Au moins pour Python 3, si vous souhaitez renvoyer une chaîne, vous devez décoder en utilisant le bon encodage:
import boto3
s3 = boto3.resource('s3')
obj = s3.Object(bucket, key)
obj.get()['Body'].read().decode('utf-8')
J'ai eu un problème pour lire / analyser l'objet à partir de S3 en raison de l' .get()
utilisation de Python 2.7 dans un AWS Lambda.
J'ai ajouté json à l'exemple pour montrer qu'il est devenu parsable :)
import boto3
import json
s3 = boto3.client('s3')
obj = s3.get_object(Bucket=bucket, Key=key)
j = json.loads(obj['Body'].read())
NOTE (pour python 2.7): Mon objet est tout ascii, donc je n'ai pas besoin .decode('utf-8')
REMARQUE (pour python 3.6+): Nous sommes passés à python 3.6 et avons découvert que read()
maintenant renvoie bytes
donc si vous voulez en extraire une chaîne, vous devez utiliser:
j = json.loads(obj['Body'].read().decode('utf-8'))
Ce n'est pas dans la documentation de boto3. Cela a fonctionné pour moi:
object.get()["Body"].read()
objet étant un objet s3: http://boto3.readthedocs.org/en/latest/reference/services/s3.html#object
get expected at least 1 arguments, got 0
. Supprimez le get()
et accédez directement à la propriété de l'objet "Body"
Python3 + Utilisation de l'approche API boto3.
En utilisant l' API S3.Client.download_fileobj et l' objet de type fichier Python , le contenu de l'objet S3 peut être récupéré en mémoire.
Puisque le contenu récupéré est en octets, pour être converti en str , il doit être décodé.
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
Si le corps contient un io.StringIO, vous devez faire comme ci-dessous:
object.get()['Body'].getvalue()
import botocore
telobj.get()['Body']
<class 'botocore.response.StreamingBody'>