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" ?
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" ?
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 , c'est-à-dire, sans le slash final ajouté, le programme supprimerait également joyeusement votre/répertoire
votre/répertoire-que-vous-vouliez-supprimer-n'est-certainement-pas-celui-ci
.
Pour plus d'informations, voir S3 boto list keys sometimes returns directory key.
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
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)
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 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.