206 votes

Comment écrire un fichier ou des données dans un objet S3 en utilisant boto3

Dans le boto 2, vous pouvez écrire dans un objet S3 en utilisant ces méthodes :

Existe-t-il un équivalent du boto 3 ? Quelle est la méthode boto3 pour sauvegarder des données dans un objet stocké sur S3 ?

5voto

Uri Goren Points 445

Il convient de mentionner smart-open qui utilise boto3 comme back-end.

smart-open est un remplacement direct de la fonction open qui peut ouvrir les fichiers de s3 ainsi que ftp , http et de nombreux autres protocoles.

par exemple

from smart_open import open
import json
with open("s3://your_bucket/your_key.json", 'r') as f:
    data = json.load(f)

Les informations d'identification d'aws sont chargées via Références boto3 généralement un fichier dans le répertoire ~/.aws/ dir ou une variable d'environnement.

-1voto

Vous pouvez utiliser le code ci-dessous pour écrire, par exemple, une image à S3 en 2019. Pour pouvoir vous connecter à S3, vous devrez installer AWS CLI à l'aide de la commande pip install awscli puis entrez quelques informations d'identification en utilisant la commande aws configure :

import urllib3
import uuid
from pathlib import Path
from io import BytesIO
from errors import custom_exceptions as cex

BUCKET_NAME = "xxx.yyy.zzz"
POSTERS_BASE_PATH = "assets/wallcontent"
CLOUDFRONT_BASE_URL = "https://xxx.cloudfront.net/"

class S3(object):
    def __init__(self):
        self.client = boto3.client('s3')
        self.bucket_name = BUCKET_NAME
        self.posters_base_path = POSTERS_BASE_PATH

    def __download_image(self, url):
        manager = urllib3.PoolManager()
        try:
            res = manager.request('GET', url)
        except Exception:
            print("Could not download the image from URL: ", url)
            raise cex.ImageDownloadFailed
        return BytesIO(res.data)  # any file-like object that implements read()

    def upload_image(self, url):
        try:
            image_file = self.__download_image(url)
        except cex.ImageDownloadFailed:
            raise cex.ImageUploadFailed

        extension = Path(url).suffix
        id = uuid.uuid1().hex + extension
        final_path = self.posters_base_path + "/" + id
        try:
            self.client.upload_fileobj(image_file,
                                       self.bucket_name,
                                       final_path
                                       )
        except Exception:
            print("Image Upload Error for URL: ", url)
            raise cex.ImageUploadFailed

        return CLOUDFRONT_BASE_URL + id

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X