8

我的 s3 存储桶“test”中有一个目录,我想删除这个目录。这就是我正在做的

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

并得到这样的回应

{'ResponseMetadata': {'HTTPStatusCode': 204, 'HostId': '************', 'RequestId': '**********'}}

但我的目录没有被删除!

我尝试了“/test”、“test/”和“/test/”等的所有组合,以及该目录内的文件和空目录,但都未能删除“test”。

4

2 回答 2

34

delete_objects使您可以使用单个 HTTP 请求从存储桶中删除多个对象。您最多可以指定 1000 个键。

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
    }
)
于 2016-09-08T13:55:20.760 回答
16

注意:有关删除多个对象的更有效方法,请参阅 Daniel Levinson 的回答。


在 S3 中,没有目录,只有键。如果密钥名称包含/诸如prefix/my-key.txt,则为了方便起见,AWS 控制台会将共享此前缀的所有密钥组合在一起。

要删除“目录”,您必须找到名称以目录名称开头的所有键并单独删除每个键。幸运的是,boto3 提供了一个过滤函数,只返回以某个字符串开头的键。所以你可以做这样的事情:

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()
于 2015-11-06T08:35:10.303 回答