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?
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')
import botocore
telobj.get()['Body']
<class 'botocore.response.StreamingBody'>
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 :)
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 renvoiebytes
donc si vous voulez en extraire une chaîne, vous devez utiliser:j = json.loads(obj['Body'].read().decode('utf-8'))
la source
Ce n'est pas dans la documentation de boto3. Cela a fonctionné pour moi:
objet étant un objet s3: http://boto3.readthedocs.org/en/latest/reference/services/s3.html#object
la source
get expected at least 1 arguments, got 0
. Supprimez leget()
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é.
la source
Si le corps contient un io.StringIO, vous devez faire comme ci-dessous:
la source