come eliminare i file dal bucket s3 di amazon?


91

Devo scrivere codice in Python che eliminerà il file richiesto da un bucket Amazon s3. Sono in grado di connettermi al bucket Amazon s3 e anche di salvare i file, ma come posso eliminare un file?


Quale (se esiste) libreria Python stai usando per il supporto S3? O stai andando direttamente alle interfacce REST o SOAP nel tuo codice Python?
TJ Crowder

1
Sto usando la libreria python boto.s3
Suhail

Risposte:


94

Utilizzando boto3(attualmente versione 1.4.4) use S3.Object.delete().

import boto3

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

1
Se l'oggetto non è presente genererà un errore?
Akash Tantri

2
@AkashTantri Non ho provato personalmente, ma il documento dice che rimuove la versione nulla (se ce n'è una) [...] Se non c'è una versione nulla, Amazon S3 non rimuove alcun oggetto. Quindi la mia ipotesi è che non genererà un errore. Se ti capita di provarlo (fai qualcosa di simile s3.Object('existing-bucket', 'bogus-key').delete()e guarda cosa succede. Prova anche s3.Object('bogus-bucket', 'bogus-key').delete().
Kohányi Róbert

Funziona come un incantesimo, questo è il vero potere del pitone
yunus

@yunus è un commento serio?
Henry Henrinson

Il your-keyqui significa il nome del file effettivo your-bucketsu S3?
Underoos

91

trovato un altro modo per farlo usando il 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)

10
Se volessi eliminare TUTTO in un secchio, potresti fare:for x in b.list(): b.delete_key(x.key)
jontsai

19
Adoro come nel mio file risulta esserebucket.list()
Artur Sapek

Affinché questo frammento di codice funzioni come presentato, dovrai importare anche Buckete Key. Come in:from boto.s3.connection import S3Connection, Bucket, Key
Nick Chammas

Ricevo per >>> 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.connectionfavore aggiorna la risposta a boto3
Harry Moreno

1
capito e ha scritto una soluzione harrymoreno.com/2017/04/24/…
Harry Moreno

74

Utilizzando l' SDK boto3 di Python (e presumendo che le credenziali siano configurate per AWS), quanto segue eliminerà un oggetto specificato in un bucket:

import boto3

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

6
@Rob La documentazione di boto3 è fuorviante. creerà un indicatore di eliminazione se l'oggetto è dotato di versione. In caso contrario, eliminerà l'oggetto.
jarmod

1
Pulito e semplice. Potrebbe essere la risposta accettata e dovrebbe essere sicuramente unita alla risposta di @ Kohányi Róbert poiché entrambi sono i migliori approcci per il compito.
PaulB

15

Benvenuti nel 2020 ecco la risposta in Python / Django:

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

Mi ci è voluto troppo tempo per trovare la risposta ed è stato così semplice.


4

Sono sorpreso che non ci sia questo modo semplice 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

Prova a cercare un metodo aggiornato , poiché Boto3 potrebbe cambiare di volta in volta. Ho usato my_bucket.delete_objects () :

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

Tramite quale interfaccia? Utilizzando l'interfaccia REST, devi solo inviare un'eliminazione :

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

Tramite l' interfaccia SOAP :

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

Se stai usando una libreria Python come boto , dovrebbe esporre una funzione di "cancellazione", come delete_key().


sì, sto usando quella libreria python, ma eliminerà il file? dovrei farlo in questo modo: k.key = 'images / anon-images / small /' + filename k.delete_key () è corretto? Per favore mi faccia sapere.
Suhail

@ Suhail: non ho usato quella libreria, ma dalla fonte che ho collegato, quello che sta effettivamente facendo è una DELETEchiamata tramite l'interfaccia REST. Quindi sì, nonostante il nome "delete_key" (che sono d'accordo non è chiaro), in realtà sta eliminando l'oggetto a cui fa riferimento la chiave.
TJ Crowder

1
Che ne dici di rimuovere molti file con un prefisso comune nel nome? S3 consente alcune eliminazioni in blocco per questo caso o eliminarle una per una (che è lenta) è il must?
Illarion Kovalchuk

@ Shaman: non sono un esperto di S3, ma per quanto ne so , puoi eliminare solo un file specifico. Ma probabilmente vorrai chiederlo come domanda in modo che attiri l'attenzione degli esperti di S3.
TJ Crowder

Subito dopo aver commentato qui ho aggiunto una domanda del genere. Ha ancora 2 viste :)
Illarion Kovalchuk

2

Il modo più semplice per farlo è:

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

1

Per ora ho risolto il problema utilizzando l'utility Linux s3cmd . L'ho usato in questo modo in Python:

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

1
Non è esattamente pitonico invocare una subshell per comunicare con S3 (una libreria o una transazione HTTP diretta sarebbe più elegante), ma funziona comunque. Non penso che meriti un voto negativo. +1.
Randall Cook

1

Ha funzionato per me provalo.

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

puoi farlo usando aws cli: https://aws.amazon.com/cli/ e alcuni comandi unix.

questo comando aws cli dovrebbe funzionare:

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

se vuoi includere sottocartelle dovresti aggiungere il flag --recursive

o con i comandi unix:

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

spiegazione:

  1. elenca tutti i file nel bucket --pipe ->
  2. ottieni il quarto parametro (è il nome del file) --pipe -> // puoi sostituirlo con il comando linux per abbinare il tuo modello
  3. eseguire delete script con aws cli

1

se stai tentando di eliminare il file utilizzando la tua console host locale, puoi provare a eseguire questo script python assumendo che tu abbia già assegnato il tuo ID di accesso e la chiave segreta nel sistema

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

Quanto segue ha funzionato per me (basato sull'esempio di un modello Django, ma puoi praticamente utilizzare il codice del deletemetodo da solo).

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)

0

Di seguito è riportato uno snippet di codice che puoi utilizzare per eliminare il bucket,

import boto3, botocore
from botocore.exceptions import ClientError

s3 = boto3.resource("s3",aws_access_key_id='Your-Access-Key',aws_secret_access_key='Your-Secret-Key')
s3.Object('Bucket-Name', 'file-name as key').delete()

0

per favore prova questo codice

import boto3   
s3 = boto3.client('s3')
s3.delete_object(Bucket="s3bucketname", Key="s3filepath")
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.