【问题标题】:Boto3, s3 folder not getting deletedBoto3,s3文件夹没有被删除
【发布时间】:2017-05-06 04:48:42
【问题描述】:

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

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

得到这样的回应

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

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

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

【问题讨论】:

  • 什么是S3Buckets3.Object() 返回一个密钥对象。你不只需要s3.Bucket('test').delete()吗?
  • S3Bucket 是我的 s3 存储桶名称
  • 那我误解了你说的目录是什么意思,没有目录之类的东西,只有桶和对象(键)。对象名称可以具有结构,例如/this/is/my/object,但 /this/is/my 并不独立于对象而存在。您如何测试存在性?

标签: python amazon-web-services amazon-s3 boto boto3


【解决方案1】:

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
    }
)

【讨论】:

  • 这应该被接受,因为它比大卫莫拉莱斯更好
  • objects_to_delete = [{'Key': obj.key} for obj in bucket.objects.filter(Prefix='test', Marker='test/path/to/dir')]
  • This extension的同样做法似乎更全面
【解决方案2】:

注意:有关删除多个对象的更有效方法,请参阅 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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    • 2017-09-30
    • 2019-08-16
    • 2019-07-22
    • 2014-08-12
    • 2020-04-24
    相关资源
    最近更新 更多