116 votes

Amazon S3 boto - comment supprimer un dossier?

J'ai créé un dossier dans s3 nommé "test" et j'ai poussé "test_1.jpg", "test_2.jpg" dans "test".

Comment puis-je utiliser boto pour supprimer le dossier "test" ?

299voto

Raz Points 381

Voici la version 2018 (presque 2019) :

s3 = boto3.resource('s3')
bucket = s3.Bucket('monbucket')
bucket.objects.filter(Prefix="monprefix/").delete()

72voto

Antti Haapala Points 11542

Il n'y a pas de dossiers dans S3. Au lieu de cela, les clés forment un espace de nom plat. Cependant, une clé avec des slashes dans son nom apparaît spécialement dans certains programmes, y compris la console AWS (voir par exemple Amazon S3 boto - comment créer un dossier ?).

Au lieu de supprimer "un répertoire", vous pouvez (et devez) lister les fichiers par préfixe et les supprimer. En essence:

for key in bucket.list(prefix='votre/répertoire/'):
    key.delete()

Cependant, les autres réponses accomplies sur cette page présentent des approches plus efficaces.


Remarquez que le préfixe est simplement recherché en utilisant une recherche en chaîne factice. Si le préfixe était votre/répertoire, c'est-à-dire, sans le slash final ajouté, le programme supprimerait également joyeusement votre/répertoire-que-vous-vouliez-supprimer-n'est-certainement-pas-ce‌​lui-ci.

Pour plus d'informations, voir S3 boto list keys sometimes returns directory key.

59voto

Patrick Points 204

Je sens que cela fait un moment et boto3 a quelques façons différentes d'accomplir ce but. Cela suppose que vous voulez supprimer le test "dossier" et tous ses objets. Voici une façon de le faire :

s3 = boto3.resource('s3')
objects_to_delete = s3.meta.client.list_objects(Bucket="MyBucket", Prefix="myfolder/test/")

delete_keys = {'Objects' : []}
delete_keys['Objects'] = [{'Key' : k} for k in [obj['Key'] for obj in objects_to_delete.get('Contents', [])]]

s3.meta.client.delete_objects(Bucket="MyBucket", Delete=delete_keys)

Cela devrait faire deux requêtes, une pour récupérer les objets dans le dossier, la deuxième pour supprimer tous les objets dudit dossier.

https://boto3.readthedocs.org/en/latest/reference/services/s3.html#S3.Client.delete_objects

27voto

dmitrybelyakov Points 2438

Une légère amélioration de la solution de Patrick. Comme vous le savez peut-être, à la fois list_objects() et delete_objects() ont une limite d'objet de 1000. C'est pourquoi vous devez paginer la liste et supprimer par tranches. C'est assez universel et vous pouvez donner Prefix à paginator.paginate() pour supprimer des sous-répertoires/chemins

client = boto3.client('s3', **credentials)
paginator = client.get_paginator('list_objects_v2')
pages = paginator.paginate(Bucket=self.bucket_name)

delete_us = dict(Objects=[])
for item in pages.search('Contents'):
    delete_us['Objects'].append(dict(Key=item['Key']))

    # flush once aws limit reached
    if len(delete_us['Objects']) >= 1000:
        client.delete_objects(Bucket=bucket, Delete=delete_us)
        delete_us = dict(Objects=[])

# flush rest
if len(delete_us['Objects']):
    client.delete_objects(Bucket=bucket, Delete=delete_us)

23voto

David Fooks Points 135

Vous pouvez utiliser bucket.delete_keys() avec une liste de clés (avec un grand nombre de clés, j'ai constaté que c'était un ordre de grandeur plus rapide que d'utiliser key.delete).

Quelque chose comme ceci :

delete_key_list = []
for key in bucket.list(prefix='/votre/dossier/'):
    delete_key_list.append(key)
    if len(delete_key_list) > 100:
        bucket.delete_keys(delete_key_list)
        delete_key_list = []

if len(delete_key_list) > 0:
    bucket.delete_keys(delete_key_list)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X