wad*_*ang 53 python amazon-s3 boto
我在s3中创建了一个名为"test"的文件夹,然后将"test_1.jpg","test_2.jpg"推入"test".
现在我想用boto删除文件夹"test".
我该怎么办?
Raz*_*Raz 83
这是2018年(差不多2019年)版本:
s3 = boto3.resource('s3')
bucket = s3.Bucket('mybucket')
bucket.objects.filter(Prefix="myprefix/").delete()
Run Code Online (Sandbox Code Playgroud)
Ant*_*ala 49
S3 中没有文件夹.相反,键形成一个平面命名空间.但是,名称中带有斜杠的键会在某些程序中特别显示,包括AWS控制台(请参阅Amazon S3 boto - 如何创建文件夹?).
您可以(并且必须)通过前缀和删除列出文件,而不是删除"目录".在本质上:
for key in bucket.list(prefix='your/directory/'):
key.delete()
Run Code Online (Sandbox Code Playgroud)
然而,此页面上其他完成的答案具有更有效的方法.
请注意,只使用虚拟字符串搜索来搜索前缀.如果前缀是,即没有附加尾部斜杠,程序也会愉快地删除your/directory
your/directory-that-you-wanted-to-remove-is-definitely-not-t??his-one
.
有关更多信息,请参阅S3 boto列表键有时会返回目录键.
Pat*_*ick 41
我觉得已经有一段时间了,boto3有几种不同的方式来实现这个目标.这假设您要删除测试 "文件夹"及其所有对象以下是一种方法:
s3 = boto3.resource('s3')
objects_to_delete = s3.meta.client.list_objects(Bucket="MyBucket", Prefix="myfolder/test/")
delete_keys = {'Objects' : []}
delete_keys['Objects'] = [{'Key' : k} for k in [obj['Key'] for obj in objects_to_delete.get('Contents', [])]]
s3.meta.client.delete_objects(Bucket="MyBucket", Delete=delete_keys)
Run Code Online (Sandbox Code Playgroud)
这应该产生两个请求,一个用于获取文件夹中的对象,第二个用于删除所述文件夹中的所有对象.
https://boto3.readthedocs.org/en/latest/reference/services/s3.html#S3.Client.delete_objects
Dav*_*oks 19
你可以使用带有键列表的bucket.delete_keys()(我发现这个键的数量比使用key.delete快一个数量级).
像这样的东西:
delete_key_list = []
for key in bucket.list(prefix='/your/directory/'):
delete_key_list.append(key)
if len(delete_key_list) > 100:
bucket.delete_keys(delete_key_list)
delete_key_list = []
if len(delete_key_list) > 0:
bucket.delete_keys(delete_key_list)
Run Code Online (Sandbox Code Playgroud)
dmi*_*kov 18
Patrick的解决方案略有改进.正如你可能知道,无论是list_objects()
和delete_objects()
有1000的对象限制这就是为什么你必须进行分页上市和块删除.这是非常普遍的,你可以给Prefix
到paginator.paginate()
删除子目录/路径
client = boto3.client('s3', **credentials)
paginator = client.get_paginator('list_objects_v2')
pages = paginator.paginate(Bucket=self.bucket_name)
delete_us = dict(Objects=[])
for item in pages.search('Contents'):
delete_us['Objects'].append(dict(Key=item['Key']))
# flush once aws limit reached
if len(delete_us['Objects']) >= 1000:
client.delete_objects(Bucket=bucket, Delete=delete_us)
delete_us = dict(Objects=[])
# flush rest
if len(delete_us['Objects']):
client.delete_objects(Bucket=bucket, Delete=delete_us)
Run Code Online (Sandbox Code Playgroud)
如果在 S3 存储桶上启用了版本控制:
s3 = boto3.resource('s3')
bucket = s3.Bucket('mybucket')
bucket.object_versions.filter(Prefix="myprefix/").delete()
Run Code Online (Sandbox Code Playgroud)