2015-10-13 1 views
4

J'ai un répertoire dans mon seau s3 'test', je veux supprimer ce répertoire. Ce est ce que je faisBoto3, dossier s3 ne pas être supprimé

s3 = boto3.resource('s3') 
s3.Object(S3Bucket,'test').delete() 

et d'obtenir une réponse comme ça

{ 'ResponseMetadata': { 'HttpStatusCode': 204, 'HostId': « ****** ****** ',' RequestId ':' ********** '}}

mais mon répertoire n'est pas supprimé!

J'ai essayé avec toutes les combinaisons de '/ test', 'test /' et '/ test /' etc, aussi avec un fichier dans ce répertoire et avec répertoire vide et tous ont échoué à supprimer 'test'.

+0

Qu'est-ce 'S3Bucket'? 's3.Object()' retourne un objet clé. Vous n'avez pas besoin de 's3.Bucket ('test'). Delete()'? – AChampion

+0

S3Bucket est mon nom de seau s3 – MikA

+1

Ensuite, je ne comprends pas ce que vous voulez dire par répertoire, il n'y a pas de choses comme des répertoires, juste des seaux et des objets (clés). Les noms d'objet peuvent avoir une structure, par ex./this/is/my/object', mais '/ this/is/my' n'existe pas indépendamment de l'objet. Comment testez-vous pour l'existence? – AChampion

Répondre

11

NOTE: Voir la réponse de Daniel Levinson pour une manière plus efficace de supprimer plusieurs objets.


En S3, il n'y a pas de répertoires, seulement des clés. Si un nom de clé contient un / tel que prefix/my-key.txt, la console AWS regroupe par la suite toutes les clés partageant ce préfixe.

Pour supprimer un "répertoire", vous devez trouver toutes les clés dont les noms commencent par le nom du répertoire et les supprimer individuellement. Heureusement, boto3 fournit une fonction de filtre pour renvoyer uniquement les clés qui commencent par une certaine chaîne. Ainsi, vous pouvez faire quelque chose comme ceci:

s3 = boto3.resource('s3') 
bucket = s3.Bucket('my-bucket-name') 
for obj in bucket.objects.filter(Prefix='test/'): 
    s3.Object(bucket.name, obj.key).delete() 
18

delete_objects vous permet de supprimer plusieurs objets d'un seau à l'aide d'une requête HTTP. Vous pouvez spécifier jusqu'à 1000 clés.

https://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Bucket.delete_objects

import boto3 

s3 = boto3.resource('s3') 
bucket = s3.Bucket('my-bucket') 

objects_to_delete = [] 
for obj in bucket.objects.filter(Prefix='test/'): 
    objects_to_delete.append({'Key': obj.key}) 

bucket.delete_objects(
    Delete={ 
     'Objects': objects_to_delete 
    } 
) 
+3

Cette réponse devrait être acceptée car elle est meilleure que celle de David Morales – baldr

+0

'objects_to_delete = [{'Key': obj.key} pour obj dans bucket.objects.filter (Prefix = 'test', Marker = 'test/chemin/à/dir ')] ' – colllin