2015-09-10 18 views
26

Ich versuche, eine Datei in meinem S3-Bucket mit Python Boto3 umzubenennen, konnte ich die Argumente nicht klar verstehen. Kann mir hier jemand helfen?Boto3/S3: Umbenennen eines Objekts mit copy_object

Was ich plane ist, ein Objekt in ein neues Objekt zu kopieren und dann das eigentliche Objekt zu löschen.

Ich habe ähnliche Fragen hier gefunden, aber ich brauche eine Lösung mit Boto3.

Antwort

34

ich eine andere Lösung

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

Ich mag diese Lösung, danke. Ein Tipp, wenn jemand genauso stolpert wie ich. Beim ersten Lesen habe ich übersehen, dass der an CopySource * übergebene Schlüssel den Bucket-Namen * enthält. Die coole Sache ist, dass dies bedeutet, dass Sie zwischen Eimern kopieren können, aber ich wurde geworfen, weil ich gerade versuchte, einen Schlüssel innerhalb des gleichen Eimers zu ändern, und nicht dachte, um es voranzustellen. Als ich das tat, bekam ich Berechtigungsfehler statt eines vernünftigeren NoSuchBucket Fehlers. Das hat mich noch mehr verwirrt! Hoffentlich können die Leute jetzt diese Falle überspringen. – t1m0

+2

Ich habe das Dictionary-Format für CopySource verwendet (das String-Format funktionierte nicht für mich): 'CopySource = 'string' oder {'Bucket': 'string', 'Key': 'string', 'VersionId': 'string '} 'basiert auf http://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Client.copy_object – Kurtis

21

Sie können keine Objekte in S3 umbenennen, so wie Sie angegeben haben, können Sie es zu einem neuen Namen kopieren müssen und gelöscht dann die alte:

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

ich folgende Störung zu erhalten: botocore.exceptions.ClientError: Ein Fehler (NoSuchBucket) aufgetreten ist, wenn der Betrieb Copyobject Aufruf: Der angegebene Eimer existiert nicht I set Bucket = 'xyz-abc-yzd' wo '' xyz-abc-yzd 'ist mein Bucket-Name Gibt es irgendeine Konvention, die befolgt werden muss, während Bucket Name/Key gesetzt wird? – MikA

+0

Gleicher Bucket, den ich mit 'list_buckets()' auflisten kann – MikA

+5

Es könnte für andere Benutzer etwas Zeit sparen. Der 'CopySource' Parameter sollte' BucketName' und 'KeyName' enthalten. Also ist 'OriginalName' NICHT genau der Objektschlüssel. – Trein

1
gefunden

Die folgenden Beispiele aus der aktualisierten Boto3-Dokumentation für die Methode copy(), die auch mit copy_object() funktioniert und jetzt die erforderliche Syntax zu sein scheint:

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

Hinweis aus Dokumentation oben verlinkten:

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

Das funktionierte für mich. –