comment supprimer des fichiers du seau amazon s3?

91

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?

Suhail
la source
Quelle bibliothèque Python (le cas échéant) utilisez-vous pour la prise en charge de S3? Ou allez-vous directement aux interfaces REST ou SOAP dans votre code Python?
TJ Crowder
1
J'utilise la bibliothèque python boto.s3
Suhail

Réponses:

94

Utilisation boto3(actuellement version 1.4.4) use S3.Object.delete().

import boto3

s3 = boto3.resource('s3')
s3.Object('your-bucket', 'your-key').delete()
Kohányi Róbert
la source
1
Si l'objet n'est pas présent, va-t-il générer une erreur?
Akash Tantri
2
@AkashTantri Je n'ai pas personnellement essayé, mais le document dit qu'il supprime la version nulle (s'il y en a une) [...] S'il n'y a pas de version nulle, Amazon S3 ne supprime aucun objet. Je suppose donc que cela ne générera pas d'erreur. S'il vous arrive de l'essayer (faites quelque chose comme s3.Object('existing-bucket', 'bogus-key').delete()et voyez ce qui se passe. Essayez également s3.Object('bogus-bucket', 'bogus-key').delete().
Kohányi Róbert
Fonctionne comme un charme, c'est le vrai pouvoir du python
yunus
@yunus est-ce un commentaire sérieux?
Henry Henrinson
Le your-keyici signifie- t-il le nom réel du fichier your-bucketsur S3?
Underoos
91

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)
Suhail
la source
10
Si vous voulez tout supprimer dans un bucket, vous pouvez faire:for x in b.list(): b.delete_key(x.key)
jontsai
19
J'adore comment dans mon fichier il s'avèrebucket.list()
Artur Sapek
Pour que cet extrait de code fonctionne comme présenté, vous devrez également importer Bucketet Key. Comme dans:from boto.s3.connection import S3Connection, Bucket, Key
Nick Chammas
Je reçois >>> 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.connections'il vous plaît mettre à jour la réponse à boto3
Harry Moreno
1
compris et rédigé une solution harrymoreno.com/2017/04/24/…
Harry Moreno
74

À 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')
Anconia
la source
6
@Rob La documentation de boto3 est trompeuse. il créera un marqueur de suppression si l'objet est versionné. Sinon, cela supprimera l'objet.
jarmod
1
Propre et simple. Cela pourrait être la réponse acceptée et devrait certainement être fusionnée avec la réponse de @ Kohányi Róbert, car les deux sont les meilleures approches pour la tâche.
PaulB
15

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.

Comm4nd0
la source
4

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()
Cyril N.
la source
4

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
            }
        ]
    }
)

Javi
la source
3

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().

TJ Crowder
la source
oui, j'utilise cette bibliothèque python, mais cela supprimera-t-il le fichier? dois-je le faire de cette façon: k.key = 'images / anon-images / small /' + filename k.delete_key () est-ce correct? s'il vous plaît, faites-moi savoir.
Suhail le
@Suhail: Je n'ai pas utilisé cette bibliothèque, mais à partir de la source que j'ai liée, ce qu'elle fait réellement est un DELETEappel 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é.
TJ Crowder
1
Qu'en est-il de la suppression de nombreux fichiers avec un préfixe commun dans le nom? S3 autorise-t-il une suppression en bloc dans ce cas, ou les supprimer un par un (ce qui est lent) est le must?
Illarion Kovalchuk
@Shaman: Je ne suis pas un expert S3, mais pour autant que je sache , vous ne pouvez supprimer qu'un fichier spécifique. Mais vous voulez probablement poser cela comme une question afin qu'elle retienne l'attention des experts de S3.
TJ Crowder
Juste après avoir commenté ici, j'ai ajouté une telle question. Il a encore 2 vues :)
Illarion Kovalchuk
2

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)
KayV
la source
1

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)
Suhail
la source
1
Ce n'est pas exactement pythonique d'invoquer un sous-shell pour communiquer avec S3 (une bibliothèque ou une transaction HTTP directe serait plus élégante), mais cela fonctionne toujours. Je ne pense pas que cela mérite un vote défavorable. +1.
Randall Cook
1

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)   
muthu
la source
1

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:

  1. lister tous les fichiers du bucket --pipe ->
  2. obtenir le 4ème paramètre (c'est le nom du fichier) --pipe -> // vous pouvez le remplacer par la commande linux pour correspondre à votre modèle
  3. exécuter le script de suppression avec aws cli
ggcarmi
la source
1

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));
Utkarsh Mehta
la source
0

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 deletemé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)
MadPhysicist
la source
0

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()
Ganesan J
la source
0

veuillez essayer ce code

import boto3   
s3 = boto3.client('s3')
s3.delete_object(Bucket="s3bucketname", Key="s3filepath")
Santosh kumar Manda
la source