2010-06-29 7 views
43

Ich muss einen Code in Python schreiben, der die erforderliche Datei aus dem Amazon S3-Bucket löscht, ich kann Verbindungen zum Amazon S3-Bucket herstellen und auch Dateien speichern, ich möchte nur wissen, wie man eine Datei löscht ? bitte helfen Sie, wenn jemand weiß.Wie lösche ich Dateien aus Amazon S3 Eimer?

+0

Welche Python-Bibliothek (falls vorhanden) verwenden Sie für die S3-Unterstützung? Oder gehen Sie direkt zu den REST- oder SOAP-Schnittstellen in Ihrem Python-Code? –

+0

ich benutze die Python-Bibliothek boto.s3 – Suhail

Antwort

2

Über welche Schnittstelle? Unter Verwendung der REST-Schnittstelle, die Sie gerade send a delete:

DELETE /ObjectName HTTP/1.1 
Host: BucketName.s3.amazonaws.com 
Date: date 
Content-Length: length 
Authorization: signatureValue 

Via die SOAP interface:

<DeleteObject xmlns="http://doc.s3.amazonaws.com/2006-03-01"> 
    <Bucket>quotes</Bucket> 
    <Key>Nelson</Key> 
    <AWSAccessKeyId> 1D9FVRAYCP1VJEXAMPLE=</AWSAccessKeyId> 
    <Timestamp>2006-03-01T12:00:00.183Z</Timestamp> 
    <Signature>Iuyz3d3P0aTou39dzbqaEXAMPLE=</Signature> 
</DeleteObject> 

Wenn Sie eine Python-Bibliothek like boto verwenden, sollte es eine "Löschen" -Funktion, wie delete_key() aussetzen.

+0

ja, ich benutze diese Python-Bibliothek, aber wird das löschen, die Datei? soll ich tun es auf diese Weise: k.key = 'images/Anon-images/small /' + Dateiname k.delete_key() ist das richtig? lass es mich wissen, bitte. – Suhail

+0

@Suhail: Ich habe diese Bibliothek nicht benutzt, aber von der Quelle, die ich verlinkt habe, ist eigentlich ein 'DELETE'-Aufruf über die REST-Schnittstelle. Also ja, trotz des Namens "delete_key" (was ich stimme zu, ist unklar), es ist wirklich das Löschen des Objekts * referenziert * mit dem Schlüssel. –

+1

Was ist mit dem Entfernen von vielen Dateien mit einem gemeinsamen Präfix im Namen? Erlaubt S3 ein Massenlöschung für einen solchen Fall, oder löschen sie einzeln (was langsam ist) ist das Muss? –

1

Für jetzt habe ich das Problem gelöst, indem Sie das Linux-Dienstprogramm s3cmd verwenden. Ich benutzte es, wie dies in Python:

+1

Es ist nicht genau pythonisch, eine Subshell aufzurufen, um mit S3 zu kommunizieren (eine Bibliothek oder eine direkte HTTP-Transaktion wäre eleganter), aber es funktioniert trotzdem. Ich denke nicht, dass es einen Downvote verdient. +1. –

+1

wirklich, das ist nicht einmal falsch – rbp

70

eine weitere Möglichkeit gefunden, es zu tun mit der Boto:

from boto.s3.connection import S3Connection, Bucket, Key 

conn = S3Connection(AWS_ACCESS_KEY, AWS_SECERET_KEY) 

b = Bucket(conn, S3_BUCKET_NAME) 

k = Key(b) 

k.key = 'images/my-images/'+filename 

b.delete_key(k) 
+9

Wenn Sie ALLES in einem Eimer löschen wollten, könnten Sie tun: 'für x in b.list(): b.delete_key (x.Schlüssel) ' – jontsai

+9

Ich liebe, wie in meiner Datei wird es' bucket.list() ' –

+0

Für dieses Code-Snippet, um wie dargestellt zu arbeiten, müssen Sie' Bucket' und 'Key' auch zu importieren. Wie in: 'from boto.s3.connection importieren S3Connection, Bucket, Key' –

3

Ich bin überrascht, es ist nicht so einfach Art und Weise: key.delete():

from boto.s3.connection import S3Connection, Bucket, Key 

conn = S3Connection(AWS_ACCESS_KEY, AWS_SECERET_KEY) 
bucket = Bucket(conn, S3_BUCKET_NAME) 
k = Key(bucket = bucket, name=path_to_file) 
k.delete() 
10

mit den Python boto3 SDK (und unter der Annahme, Anmeldeinformationen Setup sind für AWS) wird im folgenden ein angegebenes Objekt in einem Eimer löschen:

import boto3 

client = boto3.client('s3') 
client.delete_object(Bucket='mybucketname', Key='myfile.whatever') 
+2

erstellt dies nicht nur einen Lösch-Marker? – Rob

11

Verwenden Sie boto3 (derzeit Version 1.4.4) S3.Object.delete().

import boto3 

s3 = boto3.resource('s3') 
s3.Object('your-bucket', 'your-key').delete()