2015-09-10 1 views
26

J'essaie de renommer un fichier dans mon s3 s3 en utilisant python boto3, je ne pouvais pas comprendre clairement les arguments. Quelqu'un peut-il m'aider ici?Boto3/S3: renommer un objet en utilisant copy_object

Ce que je prévois est de copier l'objet à un nouvel objet, puis supprimer l'objet réel.

J'ai trouvé des questions similaires ici, mais j'ai besoin d'une solution en utilisant boto3.

Répondre

34

J'ai trouvé une autre solution

s3 = boto3.resource('s3') 
s3.Object('my_bucket','my_file_new').copy_from(CopySource='my_bucket/my_file_old') 
s3.Object('my_bucket','my_file_old').delete() 
+6

J'aime cette solution, merci. Un conseil si quelqu'un a le même trébuche que moi. En première lecture, j'ai manqué que la clé transmise à CopySource * inclut le nom du compartiment *. Ce qui est génial, c'est que cela signifie que vous pouvez copier entre des compartiments, mais j'ai été jeté parce que j'essayais juste de changer une clé dans le même compartiment, et je n'ai pas pensé à le faire précéder. Quand je l'ai fait, je recevais des erreurs de permissions au lieu d'une erreur NoSuchBucket plus sensée. Cela m'a embrouillé encore plus! J'espère que les gens peuvent sauter cet écueil maintenant. – t1m0

+2

J'ai utilisé le format de dictionnaire pour CopySource (le format de chaîne ne fonctionnait pas pour moi): 'CopySource = 'chaîne' ou {'Bucket': 'chaîne', 'Clé': 'chaîne', 'VersionId': 'chaîne '} 'basé sur http://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Client.copy_object – Kurtis

21

Vous ne pouvez pas renommer des objets dans S3, alors que vous avez indiqué, vous avez besoin de le copier dans un nouveau nom, puis supprimé l'ancien:

client.copy_object(Bucket="BucketName", CopySource="BucketName/OriginalName", Key="NewName") 
client.delete_object(Bucket="BucketName", Key="OriginalName") 
+0

Je reçois l'erreur suivante: botocore.exceptions.ClientError: Une erreur est survenue (NoSuchBucket) lors de l'appel de l'opération CopyObject: Le godet spécifié n'existe pas I set Bucket = 'xyz-abc-yzd' où '' xyz-abc-yzd '' est mon nom de compartiment Y a-t-il une convention à suivre lors de la définition du nom/de la clé du compartiment? – MikA

+0

Le même compartiment que je peux lister en utilisant 'list_buckets()' – MikA

+5

Il pourrait gagner du temps pour les autres utilisateurs. le paramètre 'CopySource' doit contenir' BucketName' et 'KeyName'. Ainsi, "OriginalName" n'est PAS exactement la clé de l'objet. – Trein

1

Exemples suivants de la documentation Boto3 mise à jour pour la méthode copy(), qui fonctionne également avec copy_object() et qui semble être la syntaxe requise maintenant:

copy_source = {'Bucket': 'source__bucket', 'Key': 'my_folder/my_file'} 
s3.copy_object(CopySource = copy_source, Bucket = 'dest_bucket', Key = 'new_folder/my_file') 
s3.delete_object(Bucket = 'source_bucket', Key = 'my_folder/my_file') 

Note de la documentation liée ci-dessus:

CopySource (dict) -- The name of the source bucket, key name of the source object, and optional version ID of the source object. The dictionary format is: {'Bucket': 'bucket', 'Key': 'key', 'VersionId': 'id'}. Note that the VersionId key is optional and may be omitted.

+0

Cela a fonctionné pour moi. –