Boto3,s3文件夹未被删除

Mik*_*ikA 5 python amazon-s3 boto amazon-web-services boto3

我的s3存储桶'test'中有一个目录,我想删除这个目录.这就是我正在做的事情

s3 = boto3.resource('s3')
s3.Object(S3Bucket,'test').delete()
Run Code Online (Sandbox Code Playgroud)

并获得这样的回应

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

但是我的目录没有被删除!

我尝试使用'/ test','test /'和'/ test /'等所有组合,也使用该目录中的文件和空目录,并且都无法删除'test'.

小智 27

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
    }
)
Run Code Online (Sandbox Code Playgroud)

  • 这应该是接受的答案,因为它比David Morales更好 (4认同)
  • `objects_to_delete = [{'Key':obj.key} for bucket中的obj.objects.filter(Prefix ='test',Marker ='test/path/to/dir')]` (2认同)

Dav*_*les 15

注意:请参阅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()
Run Code Online (Sandbox Code Playgroud)