Je suis conscient qu'avec Boto 2, il est possible d'ouvrir un objet S3 en tant que chaîne avec:
get_contents_as_string () http://boto.readthedocs.org/en/latest/ref/file.html?highlight=contents%20string#boto.file.key.get_contents_as_string
Existe-t-il une fonction équivalente dans boto3?
read
retournera des octets. Au moins pour Python 3, si vous souhaitez renvoyer une chaîne, vous devez le décoder à l'aide du codage correct:
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 depuis S3 à cause de .get()
en utilisant Python 2.7 à l'intérieur d'un AWS Lambda.
J'ai ajouté json à l'exemple pour montrer qu'il est devenu analysable :)
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 entièrement ascii, je n'ai donc pas besoin de .decode('utf-8')
NOTE (pour python 3.6+): Nous sommes passés à python 3.6 et avons découvert que read()
renvoie désormais bytes
, donc si vous voulez en extraire une chaîne, vous devez utilisation:
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
Python3 + Utilisation de l’API boto3.
En utilisant API S3.Client.download_fileobj et objet de type fichier Python, le contenu de l'objet S3 peut être récupéré en mémoire.
Comme le contenu récupéré est en octets, pour pouvoir ê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