Necesito escribir código en Python que borrará el archivo requerido de un bucket de Amazon s3. Puedo conectarme al bucket de Amazon s3 y también guardar archivos, pero ¿cómo puedo eliminar un archivo?
Necesito escribir código en Python que borrará el archivo requerido de un bucket de Amazon s3. Puedo conectarme al bucket de Amazon s3 y también guardar archivos, pero ¿cómo puedo eliminar un archivo?
Respuestas:
Usando boto3
(actualmente versión 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()
y verás qué pasa. s3.Object('bogus-bucket', 'bogus-key').delete()
your-key
Significa aquí el nombre de archivo real your-bucket
en S3?
encontré una forma más de hacerlo usando el 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
y Key
también. Como en: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
favor, actualice la respuesta a boto3
Con el SDK de Python boto3 (y asumiendo que las credenciales están configuradas para AWS), lo siguiente eliminará un objeto específico en un depósito:
import boto3
client = boto3.client('s3')
client.delete_object(Bucket='mybucketname', Key='myfile.whatever')
Bienvenido a 2020, aquí está la respuesta en 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}")
Me tomó demasiado tiempo encontrar la respuesta y fue tan simple como esto.
Intente buscar un método actualizado , ya que Boto3 puede cambiar de vez en cuando. Solía 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
}
]
}
)
¿A través de qué interfaz? Usando la interfaz REST, simplemente envía una eliminación :
DELETE /ObjectName HTTP/1.1
Host: BucketName.s3.amazonaws.com
Date: date
Content-Length: length
Authorization: signatureValue
A través de la interfaz 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>
Si está utilizando una biblioteca de Python como boto , debería exponer una función de "eliminar", como delete_key()
.
DELETE
llamada a través de la interfaz REST. Así que sí, a pesar del nombre "delete_key" (que estoy de acuerdo que no está claro), realmente está eliminando el objeto al que hace referencia la clave.
Por ahora, resolví el problema utilizando la utilidad de Linux s3cmd . Lo usé así en Python:
delFile = 's3cmd -c /home/project/.s3cfg del s3://images/anon-images/small/' + filename
os.system(delFile)
Me ha funcionado, pruébalo.
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)
puede hacerlo usando aws cli: https://aws.amazon.com/cli/ y algún comando de Unix.
estos comandos aws cli deberían funcionar:
aws s3 rm s3://<your_bucket_name> --exclude "*" --include "<your_regex>"
si desea incluir subcarpetas, debe agregar la bandera --recursiva
o con comandos de 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'
explicación:
si está tratando de eliminar el archivo usando su propia consola de host local, entonces puede intentar ejecutar este script de Python asumiendo que ya ha asignado su identificación de acceso y clave secreta en el 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));
Lo siguiente funcionó para mí (basado en el ejemplo de un modelo de Django, pero puedes usar el código del delete
método por sí 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)
A continuación, se muestra un fragmento de código que puede usar para eliminar el depósito,
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()
por favor intente este código
import boto3
s3 = boto3.client('s3')
s3.delete_object(Bucket="s3bucketname", Key="s3filepath")