Je dois déplacer des fichiers d'un compartiment à un autre avec l'API Python Boto. (J'en ai besoin pour "couper" le fichier du premier seau et le "coller" dans le second) . Quel est le meilleur moyen de le faire?
** Remarque: Est-ce important si j'ai deux clés d'accès différentes et des clés secrètes?
Je pense que la documentation boto S3 répond à votre question.
https://github.com/boto/boto/blob/develop/docs/source/s3_tut.rst
Le transfert de fichiers d'un compartiment à un autre via boto constitue en réalité une copie des clés d'une source à une autre que la suppression de la clé d'une source.
Vous pouvez avoir accès aux seaux:
import boto
c = boto.connect_s3()
src = c.get_bucket('my_source_bucket')
dst = c.get_bucket('my_destination_bucket')
et itérer les clés:
for k in src.list():
# copy stuff to your destination here
dst.copy_key(k.key.name, src.name, k.key.name)
# then delete the source key
k.delete()
Voir aussi: Est-il possible de copier tous les fichiers d'un compartiment S3 à un autre avec s3cmd?
Si vous utilisez boto3 (la version la plus récente de boto) c'est assez simple
import boto3
s3 = boto3.resource('s3')
copy_source = {
'Bucket': 'mybucket',
'Key': 'mykey'
}
s3.meta.client.copy(copy_source, 'otherbucket', 'otherkey')
( Docs )
awscli fait le travail 30 fois plus rapidement que de gérer et supprimer chaque touche. Probablement dû au multithreading dans awscli. Si vous voulez toujours l'exécuter à partir de votre script python sans appeler de commandes Shell, vous pouvez essayer quelque chose comme ça:
Installez le paquet awscli python:
Sudo pip install awscli
Et puis c'est aussi simple que ça:
import os
if os.environ.get('LC_CTYPE', '') == 'UTF-8':
os.environ['LC_CTYPE'] = 'en_US.UTF-8'
from awscli.clidriver import create_clidriver
driver = create_clidriver()
driver.main('s3 mv source_bucket target_bucket --recursive'.split())
Le nom du compartiment doit être une chaîne et non un objet de compartiment . Les modifications ci-dessous ont fonctionné pour moi
for k in src.list():
dst.copy_key(k.key, src.name, k.key)
Si tu veux
Créez une copie d'un objet déjà stocké dans Amazon S3.
then copy_object est le chemin à parcourir dans boto3.
Comment je le fais:
import boto3
aws_access_key_id = ""
aws_secret_access_key = ""
bucket_from = ""
bucket_to = ""
s3 = boto3.resource(
's3',
aws_access_key_id=aws_access_key_id,
aws_secret_access_key=aws_secret_access_key
)
src = s3.Bucket(bucket_from)
def move_files():
for archive in src.objects.all():
# filters on archive.key might be applied here
s3.meta.client.copy_object(
ACL='public-read',
Bucket=bucket_to,
CopySource={'Bucket': bucket_from, 'Key': archive.key},
Key=archive.key
)
move_files()