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