web-dev-qa-db-fra.com

Ouvrir un objet S3 sous forme de chaîne avec Boto3

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?

117
Gahl Levy

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

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

72
EvgenyKolyakov

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

69
Gahl Levy

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
5
Gatsby Lee