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?
91
Réponses:
Utilisation
boto3
(actuellement version 1.4.4) useS3.Object.delete()
.import boto3 s3 = boto3.resource('s3') s3.Object('your-bucket', 'your-key').delete()
la source
s3.Object('existing-bucket', 'bogus-key').delete()
et voyez ce qui se passe. Essayez égalements3.Object('bogus-bucket', 'bogus-key').delete()
.your-key
ici signifie- t-il le nom réel du fichieryour-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)
la source
for x in b.list(): b.delete_key(x.key)
bucket.list()
Bucket
etKey
. 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')
la source
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.
la source
Je suis surpris qu'il n'y ait pas ce moyen facile
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()
la source
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 } ] } )
la source
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()
.la source
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é.Le moyen le plus simple de le faire est:
import boto3 s3 = boto3.resource("s3") bucket_source = { 'Bucket': "my-bcuket", 'Key': "file_path_in_bucket" } s3.meta.client.delete(bucket_source)
la source
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)
la source
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)
la source
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:
la source
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));
la source
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)
la source
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()
la source
veuillez essayer ce code
import boto3 s3 = boto3.client('s3') s3.delete_object(Bucket="s3bucketname", Key="s3filepath")
la source