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?
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?
Risposte:
Utilizzando boto3
(attualmente versione 1.4.4) use S3.Object.delete()
.
import boto3
s3 = boto3.resource('s3')
s3.Object('your-bucket', 'your-key').delete()
s3.Object('existing-bucket', 'bogus-key').delete()
e guarda cosa succede. Prova anche s3.Object('bogus-bucket', 'bogus-key').delete()
.
your-key
qui significa il nome del file effettivo your-bucket
su S3?
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)
for x in b.list(): b.delete_key(x.key)
bucket.list()
Bucket
e Key
. Come 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
favore aggiorna la risposta a boto3
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')
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.
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()
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
}
]
}
)
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()
.
DELETE
chiamata 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.
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)
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)
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:
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));
Quanto segue ha funzionato per me (basato sull'esempio di un modello Django, ma puoi praticamente utilizzare il codice del delete
metodo 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)
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()
per favore prova questo codice
import boto3
s3 = boto3.client('s3')
s3.delete_object(Bucket="s3bucketname", Key="s3filepath")