Wie lösche ich Dateien aus Amazon S3 Bucket?


89

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)

10
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
Harry Moreno

1
fand es heraus und schrieb eine Lösung harrymoreno.com/2017/04/24/…
Harry Moreno

88

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

import boto3

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

1
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:

import boto3

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

6
@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:

import boto3    
s3 = boto3.client('s3')
s3.delete_object(Bucket=settings.AWS_STORAGE_BUCKET_NAME, Key=f"media/{item.file.name}")

Ich habe viel zu lange gebraucht, um die Antwort zu finden, und so einfach war das.


4

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

4

Versuchen Sie, nach einer aktualisierten Methode zu suchen , da sich Boto3 von Zeit zu Zeit ändern kann. Ich habe my_bucket.delete_objects () verwendet :

import boto3
from boto3.session import Session

session = Session(aws_access_key_id='your_key_id',
                  aws_secret_access_key='your_secret_key')

# s3_client = session.client('s3')
s3_resource = session.resource('s3')
my_bucket = s3_resource.Bucket("your_bucket_name")

response = my_bucket.delete_objects(
    Delete={
        'Objects': [
            {
                'Key': "your_file_name_key"   # the_name of_your_file
            }
        ]
    }
)

3

Über welche Schnittstelle? Über die REST-Schnittstelle senden Sie einfach einen Löschvorgang :

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

Über die SOAP-Schnittstelle :

<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 wie boto verwenden , sollte sie eine "Lösch" -Funktion wie z delete_key().


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 :)
Illarion Kovalchuk

2

Der einfachste Weg, dies zu tun, ist:

import boto3
s3 = boto3.resource("s3")
bucket_source = {
            'Bucket': "my-bcuket",
            'Key': "file_path_in_bucket"
        }
s3.meta.client.delete(bucket_source)

1

Im Moment habe ich das Problem mit dem Linux-Dienstprogramm s3cmd behoben . Ich habe es in Python so verwendet:

delFile = 's3cmd -c /home/project/.s3cfg del s3://images/anon-images/small/' + filename
os.system(delFile)

1
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 import Key
import 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)   

1

Sie können es mit aws cli tun: https://aws.amazon.com/cli/ und einem Unix-Befehl .

Diese aws cli-Befehle sollten funktionieren:

aws s3 rm s3://<your_bucket_name> --exclude "*" --include "<your_regex>" 

Wenn Sie Unterordner einschließen möchten, sollten Sie das Flag --recursive hinzufügen

oder mit Unix-Befehlen:

aws s3 ls s3://<your_bucket_name>/ | awk '{print $4}' | xargs -I%  <your_os_shell>   -c 'aws s3 rm s3:// <your_bucket_name>  /% $1'

Erläuterung:

  1. liste alle Dateien im Bucket auf --pipe ->
  2. Holen Sie sich den 4. Parameter (es ist der Dateiname) --pipe -> Sie // Sie können ihn durch einen Linux-Befehl ersetzen, der Ihrem Muster entspricht
  3. Führen Sie das Löschskript mit aws cli aus

1

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

0

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

import boto3
from boto3.session import Session
from django.conf import settings

class Video(models.Model):
    title=models.CharField(max_length=500)
    description=models.TextField(default="")
    creation_date=models.DateTimeField(default=timezone.now)
    videofile=models.FileField(upload_to='videos/', null=True, verbose_name="")
    tags = TaggableManager()

    actions = ['delete']

    def __str__(self):
        return self.title + ": " + str(self.videofile)

    def delete(self, *args, **kwargs):
        session = Session (settings.AWS_ACCESS_KEY_ID, settings.AWS_SECRET_ACCESS_KEY)
        s3_resource = session.resource('s3')
        s3_bucket = s3_resource.Bucket(settings.AWS_STORAGE_BUCKET_NAME)

        file_path = "media/" + str(self.videofile)
        response = s3_bucket.delete_objects(
            Delete={
                'Objects': [
                    {
                        'Key': file_path
                    }
                ]
            })
        super(Video, self).delete(*args, **kwargs)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.