【发布时间】:2019-06-18 17:53:25
【问题描述】:
documentation 在谈到如何删除文件夹的内容时有点模棱两可。如果你看一下它是如何为 boto3 完成的,key 并没有在 boto3 前面的部分中定义,它只在 boto2 示例中定义。
什么是删除文件夹内容的灵活(超过 1000 个文件)惯用语?
【问题讨论】:
标签: python amazon-web-services amazon-s3 boto3
documentation 在谈到如何删除文件夹的内容时有点模棱两可。如果你看一下它是如何为 boto3 完成的,key 并没有在 boto3 前面的部分中定义,它只在 boto2 示例中定义。
什么是删除文件夹内容的灵活(超过 1000 个文件)惯用语?
【问题讨论】:
标签: python amazon-web-services amazon-s3 boto3
我认为您也不能在 boto2 中的单个习语中删除 1000 多个项目。但是,从 boto3 的角度来看,您可以尝试以下操作:
s3 = boto3.resource('s3')
bucket = s3.Bucket('bucket-name')
bucket.objects.filter(Prefix="path/to/dir").delete()
以上内容已经过测试并且正在运行
>>> import boto3
>>> s3 = boto3.resource('s3')
>>> b = s3.Bucket('MY_BUCKET_NAME')
>>> b.objects.filter(Prefix="test/stuff")
s3.Bucket.objectsCollection(s3.Bucket(name='MY_BUCKET_NAME'), s3.ObjectSummary)
>>> list(b.objects.filter(Prefix="test/stuff"))
[s3.ObjectSummary(bucket_name='MY_BUCKET_NAME', key=u'test/stuff/new')]
>>> b.objects.filter(Prefix="test/stuff").delete()
[{u'Deleted': [{u'Key': 'test/stuff/new'}], 'ResponseMetadata': {'HTTPStatusCode': 200, 'RetryAttempts': 0, 'HostId': 'BASE64_ID_1', 'RequestId': 'REQ_ID', 'HTTPHeaders': {'x-amz-id-2': 'BASE64_ID_2', 'server': 'AmazonS3', 'transfer-encoding': 'chunked', 'connection': 'close', 'x-amz-request-id': 'REQ_ID', 'date': 'Fri, 12 May 2017 21:21:47 GMT', 'content-type': 'application/xml'}}}]
>>>
【讨论】:
什么是删除文件夹内容的灵活(超过 1000 个文件)惯用语?
没有。
S3 中的主要资源是存储桶中的对象(由键标识)。
文件夹不是资源,也不是容器——
它们是为了方便而创建的虚构结构,在对象键中存在/ 定界符。 (可以由控制台创建的“空”文件夹只是一个零字节对象,其键以/ 结尾)。
因此,没有“删除文件夹及其所有内容”的习语。即使在控制台中完成此操作的能力是通过向 API 发送删除或多对象删除请求(限制为 1000 个)。
生命周期策略也可用于删除具有给定键前缀的所有对象。这有一个以天为单位的时间粒度,并且对象在创建后的指定天数内被删除,+1/-0 天(它们可能会持续最多 23:59:59,比自政策以来指定的实际时间长每天只评估一次——不是实时的)。
【讨论】: