J'ai besoin d'écrire du code en python qui supprimera le fichier requis d'un compartiment Amazon s3. Je suis capable de me connecter au compartiment Amazon s3, et également d'enregistrer des fichiers, mais comment puis-je supprimer un fichier?
J'ai besoin d'écrire du code en python qui supprimera le fichier requis d'un compartiment Amazon s3. Je suis capable de me connecter au compartiment Amazon s3, et également d'enregistrer des fichiers, mais comment puis-je supprimer un fichier?
Réponses:
Utilisation boto3
(actuellement version 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()
et voyez ce qui se passe. Essayez également s3.Object('bogus-bucket', 'bogus-key').delete()
.
your-key
ici signifie- t-il le nom réel du fichier your-bucket
sur S3?
trouvé un autre moyen de le faire en utilisant le 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
et Key
. Comme dans: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
s'il vous plaît mettre à jour la réponse à boto3
À l'aide du SDK Python boto3 (et en supposant que les informations d'identification sont configurées pour AWS), ce qui suit supprimera un objet spécifié dans un compartiment:
import boto3
client = boto3.client('s3')
client.delete_object(Bucket='mybucketname', Key='myfile.whatever')
Bienvenue en 2020, voici la réponse 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}")
Il m'a fallu beaucoup trop de temps pour trouver la réponse et c'était aussi simple que cela.
Essayez de rechercher une méthode mise à jour , car Boto3 peut changer de temps en temps. J'ai utilisé 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
}
]
}
)
Par quelle interface? En utilisant l'interface REST, il vous suffit d' envoyer une suppression :
DELETE /ObjectName HTTP/1.1
Host: BucketName.s3.amazonaws.com
Date: date
Content-Length: length
Authorization: signatureValue
Via l' interface 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 vous utilisez une bibliothèque Python comme boto , elle devrait exposer une fonctionnalité de «suppression», comme delete_key()
.
DELETE
appel via l'interface REST. Alors oui, malgré le nom "delete_key" (qui, je suis d'accord, n'est pas clair), c'est vraiment la suppression de l'objet référencé par la clé.
Pour l'instant, j'ai résolu le problème en utilisant l'utilitaire Linux s3cmd . Je l'ai utilisé comme ça en Python:
delFile = 's3cmd -c /home/project/.s3cfg del s3://images/anon-images/small/' + filename
os.system(delFile)
Cela a fonctionné pour moi, essayez-le.
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)
vous pouvez le faire en utilisant aws cli: https://aws.amazon.com/cli/ et une commande unix.
cette commande aws cli devrait fonctionner:
aws s3 rm s3://<your_bucket_name> --exclude "*" --include "<your_regex>"
si vous souhaitez inclure des sous-dossiers, vous devez ajouter l'indicateur --recursive
ou avec des commandes 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'
explication:
si vous essayez de supprimer un fichier en utilisant votre propre console hôte locale, vous pouvez essayer d'exécuter ce script python en supposant que vous avez déjà attribué votre identifiant d'accès et votre clé secrète dans le système
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));
Ce qui suit a fonctionné pour moi (basé sur l'exemple d'un modèle Django, mais vous pouvez à peu près utiliser le code de la delete
méthode seule).
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)
Vous trouverez ci-dessous un extrait de code que vous pouvez utiliser pour supprimer le compartiment,
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()
veuillez essayer ce code
import boto3
s3 = boto3.client('s3')
s3.delete_object(Bucket="s3bucketname", Key="s3filepath")