Ich muss Code in Python schreiben, der die erforderliche Datei aus einem Amazon S3-Bucket löscht. Ich kann eine Verbindung zum Amazon S3-Bucket herstellen und auch Dateien speichern. Wie kann ich eine Datei löschen?
Welche (falls vorhanden) Python-Bibliothek verwenden Sie für die S3-Unterstützung? Oder gehen Sie direkt zu den REST- oder SOAP-Schnittstellen in Ihrem Python-Code?
TJ Crowder
1
Ich benutze die Python-Bibliothek boto.s3
Suhail
Antworten:
91
habe einen weiteren Weg gefunden, dies mit dem Boto zu tun:
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)
Wenn Sie ALLES in einem Eimer löschen for x in b.list(): b.delete_key(x.key)
möchten
19
Ich liebe, wie sich in meiner Akte herausstelltbucket.list()
Artur Sapek
Zu diesem Code - Schnipsel zu arbeiten , wie dargestellt, werden Sie importieren müssen Bucketund Keyauch. Wie in:from boto.s3.connection import S3Connection, Bucket, Key
Nick Chammas
Ich bekomme >>> from boto.s3.connection import S3Connection, Bucket, Key Traceback (most recent call last): File "<console>", line 1, in <module> ImportError: No module named boto.s3.connectionbitte aktualisieren Sie die Antwort auf boto3
Wenn das Objekt nicht vorhanden ist, wird es einen Fehler auslösen?
Akash Tantri
1
@AkashTantri Ich habe es nicht persönlich versucht, aber das Dokument sagt, dass es die Nullversion entfernt (falls vorhanden). [...] Wenn es keine Nullversion gibt, entfernt Amazon S3 keine Objekte. Ich vermute also, dass es keinen Fehler gibt. Wenn Sie es versuchen (tun Sie einfach etwas wie s3.Object('existing-bucket', 'bogus-key').delete()und sehen Sie, was passiert. Versuchen Sie es auch s3.Object('bogus-bucket', 'bogus-key').delete().
Kohányi Róbert
Funktioniert wie ein Zauber, das ist die wahre Kraft von Python
Yunus
@yunus ist das ein ernsthafter Kommentar?
Henry Henrinson
Bedeutet das your-keyhier den tatsächlichen Dateinamen in your-bucketS3?
Jarvis
68
Mit dem Python boto3 SDK (und unter der Annahme, dass Anmeldeinformationen für AWS eingerichtet sind) wird Folgendes ein bestimmtes Objekt in einem Bucket löschen:
@Rob Die boto3-Dokumentation ist irreführend. Wenn das Objekt versioniert ist, wird eine Löschmarkierung erstellt. Andernfalls wird das Objekt gelöscht.
Jarmod
1
Sauber und einfach. Könnte die akzeptierte Antwort sein und sollte definitiv mit der Antwort von @ Kohányi Róbert zusammengeführt werden, da beide die besten Ansätze für die Aufgabe sind.
PaulB
10
Willkommen zu 2020 hier ist die Antwort in Python / Django:
Versuchen Sie, nach einer aktualisierten Methode zu suchen , da sich Boto3 von Zeit zu Zeit ändern kann. Ich habe my_bucket.delete_objects () verwendet :
Ja, ich verwende diese Python-Bibliothek, aber wird dadurch die Datei gelöscht? soll ich es so machen: k.key = 'images / anon-images / small /' + Dateiname k.delete_key () ist das richtig? Lass es mich wissen, bitte.
Suhail
@Suhail: Ich habe diese Bibliothek nicht verwendet, aber von der Quelle, die ich verlinkt habe, ist es tatsächlich ein DELETEAufruf über die REST-Schnittstelle. Also ja, trotz des Namens "delete_key" (dem ich zustimme, dass er unklar ist) wird das Objekt, auf das der Schlüssel verweist , wirklich gelöscht .
TJ Crowder
1
Was ist mit dem Entfernen vieler Dateien mit einem gemeinsamen Präfix im Namen? Erlaubt S3 für einen solchen Fall ein Massenlöschen, oder ist das Löschen nacheinander (was langsam ist) das Muss?
Illarion Kovalchuk
@Shaman: Ich bin kein S3-Experte, aber soweit ich weiß , können Sie nur eine bestimmte Datei löschen. Aber Sie möchten das wahrscheinlich tatsächlich als Frage stellen, damit S3-Experten darauf aufmerksam werden.
TJ Crowder
Gleich nach dem Kommentieren hier habe ich eine solche Frage hinzugefügt. Es hat 2 Ansichten noch :)
Es ist nicht gerade 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 eine Ablehnung verdient. +1.
Randall Cook
1
Es hat bei mir funktioniert, versuche es.
import boto
import sys
from boto.s3.key importKeyimport boto.s3.connection
AWS_ACCESS_KEY_ID ='<access_key>'
AWS_SECRET_ACCESS_KEY ='<secret_access_key>'Bucketname='bucket_name'
conn = boto.s3.connect_to_region('us-east-2',
aws_access_key_id=AWS_ACCESS_KEY_ID,
aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
is_secure=True,
calling_format = boto.s3.connection.OrdinaryCallingFormat(),)
bucket = conn.get_bucket(Bucketname)
k =Key(bucket)
k.key ='filename to delete'
bucket.delete_key(k)
Wenn Sie versuchen, eine Datei mit Ihrer eigenen lokalen Hostkonsole zu löschen, können Sie versuchen, dieses Python-Skript auszuführen, vorausgesetzt, Sie haben Ihre Zugriffs-ID und Ihren geheimen Schlüssel bereits im System zugewiesen
import boto3
#my custom sesssion
aws_m=boto3.session.Session(profile_name="your-profile-name-on-local-host")
client=aws_m.client('s3')#list bucket objects before deleting
response = client.list_objects(Bucket='your-bucket-name')for x in response.get("Contents",None):print(x.get("Key",None));#delete bucket objects
response = client.delete_object(Bucket='your-bucket-name',Key='mydocs.txt')#list bucket objects after deleting
response = client.list_objects(Bucket='your-bucket-name')for x in response.get("Contents",None):print(x.get("Key",None));
Das Folgende hat bei mir funktioniert (basierend auf einem Beispiel für ein Django-Modell, aber Sie können den Code der deleteMethode so ziemlich alleine verwenden).
Antworten:
habe einen weiteren Weg gefunden, dies mit dem Boto zu tun:
quelle
for x in b.list(): b.delete_key(x.key)
bucket.list()
Bucket
undKey
auch. Wie in:from boto.s3.connection import S3Connection, Bucket, Key
>>> from boto.s3.connection import S3Connection, Bucket, Key Traceback (most recent call last): File "<console>", line 1, in <module> ImportError: No module named boto.s3.connection
bitte aktualisieren Sie die Antwort auf boto3Verwenden
boto3
(derzeit Version 1.4.4) verwendenS3.Object.delete()
.quelle
s3.Object('existing-bucket', 'bogus-key').delete()
und sehen Sie, was passiert. Versuchen Sie es auchs3.Object('bogus-bucket', 'bogus-key').delete()
.your-key
hier den tatsächlichen Dateinamen inyour-bucket
S3?Mit dem Python boto3 SDK (und unter der Annahme, dass Anmeldeinformationen für AWS eingerichtet sind) wird Folgendes ein bestimmtes Objekt in einem Bucket löschen:
quelle
Willkommen zu 2020 hier ist die Antwort in Python / Django:
Ich habe viel zu lange gebraucht, um die Antwort zu finden, und so einfach war das.
quelle
Ich bin überrascht , es ist nicht so einfach Art und Weise:
key.delete()
:quelle
Versuchen Sie, nach einer aktualisierten Methode zu suchen , da sich Boto3 von Zeit zu Zeit ändern kann. Ich habe my_bucket.delete_objects () verwendet :
quelle
Über welche Schnittstelle? Über die REST-Schnittstelle senden Sie einfach einen Löschvorgang :
Über die SOAP-Schnittstelle :
Wenn Sie eine Python-Bibliothek wie boto verwenden , sollte sie eine "Lösch" -Funktion wie z
delete_key()
.quelle
DELETE
Aufruf über die REST-Schnittstelle. Also ja, trotz des Namens "delete_key" (dem ich zustimme, dass er unklar ist) wird das Objekt, auf das der Schlüssel verweist , wirklich gelöscht .Der einfachste Weg, dies zu tun, ist:
quelle
Im Moment habe ich das Problem mit dem Linux-Dienstprogramm s3cmd behoben . Ich habe es in Python so verwendet:
quelle
Es hat bei mir funktioniert, versuche es.
quelle
Sie können es mit aws cli tun: https://aws.amazon.com/cli/ und einem Unix-Befehl .
Diese aws cli-Befehle sollten funktionieren:
Wenn Sie Unterordner einschließen möchten, sollten Sie das Flag --recursive hinzufügen
oder mit Unix-Befehlen:
Erläuterung:
quelle
Wenn Sie versuchen, eine Datei mit Ihrer eigenen lokalen Hostkonsole zu löschen, können Sie versuchen, dieses Python-Skript auszuführen, vorausgesetzt, Sie haben Ihre Zugriffs-ID und Ihren geheimen Schlüssel bereits im System zugewiesen
quelle
Das Folgende hat bei mir funktioniert (basierend auf einem Beispiel für ein Django-Modell, aber Sie können den Code der
delete
Methode so ziemlich alleine verwenden).quelle