web-dev-qa-db-fra.com

Comment écrire un fichier ou des données sur un objet S3 à l'aide de boto3

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

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

64
jkdev

Dans boto 3, les méthodes 'Key.set_contents_from_' ont été remplacées par

Par exemple:

import boto3

some_binary_data = b'Here we have some data'
more_binary_data = b'Here we have some more data'

# Method 1: Object.put()
s3 = boto3.resource('s3')
object = s3.Object('my_bucket_name', 'my/key/including/filename.txt')
object.put(Body=some_binary_data)

# Method 2: Client.put_object()
client = boto3.client('s3')
client.put_object(Body=more_binary_data, Bucket='my_bucket_name', Key='my/key/including/anotherfilename.txt')

Alternativement, les données binaires peuvent provenir de la lecture d’un fichier, comme décrit dans la documentation officielle comparant boto 2 et boto :

Stocker des données

Stocker des données à partir d'un fichier, d'un flux ou d'une chaîne est simple:

# Boto 2.x
from boto.s3.key import Key
key = Key('hello.txt')
key.set_contents_from_file('/tmp/hello.txt')

# Boto 3
s3.Object('mybucket', 'hello.txt').put(Body=open('/tmp/hello.txt', 'rb'))
138
jkdev

boto3 a également une méthode pour télécharger un fichier directement:

s3.Bucket('bucketname').upload_file('/local/file/here.txt','folder/sub/path/to/s3key')

http://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Bucket.upload_file

32
EM Bee

Voici une astuce intéressante pour lire JSON à partir de s3:

import json, boto3
s3 = boto3.resource("s3").Bucket("bucket")
json.load_s3 = lambda f: json.load(s3.Object(key=f).get()["Body"])
json.dump_s3 = lambda obj, f: s3.Object(key=f).put(Body=json.dumps(obj))

Vous pouvez maintenant utiliser json.load_s3 et json.dump_s3 avec la même API que load et dump.

data = {"test":0}
json.dump_s3(data, "key") # saves json to s3://bucket/key
data = json.load_s3("key") # read json from s3://bucket/key
23
Uri Goren

Vous n'avez plus besoin de convertir le contenu en binaire avant d'écrire dans le fichier en S3. L'exemple suivant crée un nouveau fichier texte (appelé newfile.txt) dans un compartiment S3 avec un contenu de chaîne:

import boto3

s3 = boto3.resource(
    's3',
    region_name='us-east-1',
    aws_access_key_id=KEY_ID,
    aws_secret_access_key=ACCESS_KEY
)
content="String content to write to a new S3 file"
s3.Object('my-bucket-name', 'newfile.txt').put(Body=content)
14
Franke

Une version plus propre et concise que j'utilise pour télécharger des fichiers à la volée vers un compartiment et un sous-dossier S3 donné.

import boto3

BUCKET_NAME = 'sample_bucket_name'
PREFIX = 'sub-folder/'

s3 = boto3.resource('s3')

# Creating an empty file called "_DONE" and putting it in the S3 bucket
s3.Object(BUCKET_NAME, PREFIX + '_DONE').put(Body="")

Remarque : Vous devez TOUJOURS indiquer vos informations d'identification AWS (aws_access_key_id et aws_secret_access_key) dans un fichier séparé, par exemple: ~/.aws/credentials

3
kev

il convient de mentionner smart-open qui utilise boto3 en tant que back-end.

smart-open est un remplacement instantané de open de Python pouvant 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 aws sont chargées via informations d'identification boto , généralement un fichier dans le répertoire ~/.aws/ ou une variable d'environnement.

0
Uri Goren