Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 亚马逊S3博托-如何删除文件夹?_Python_Amazon S3_Boto - Fatal编程技术网

Python 亚马逊S3博托-如何删除文件夹?

Python 亚马逊S3博托-如何删除文件夹?,python,amazon-s3,boto,Python,Amazon S3,Boto,我在s3中创建了一个名为“test”的文件夹,并将“test_1.jpg”、“test_2.jpg”推到了“test”中 如何使用boto删除文件夹“test”?S3中没有文件夹。相反,键形成一个平面名称空间。但是,名称中带有斜杠的键在某些程序中特别显示,包括AWS控制台(参见示例) 您可以(并且必须)按前缀列出文件并删除,而不是删除“目录”。实质上: for key in bucket.list(prefix='your/directory/'): key.delete() 然而,本

我在s3中创建了一个名为“test”的文件夹,并将“test_1.jpg”、“test_2.jpg”推到了“test”中


如何使用boto删除文件夹“test”?

S3中没有文件夹。相反,键形成一个平面名称空间。但是,名称中带有斜杠的键在某些程序中特别显示,包括AWS控制台(参见示例)

您可以(并且必须)按前缀列出文件并删除,而不是删除“目录”。实质上:

for key in bucket.list(prefix='your/directory/'):
    key.delete()
然而,本页上其他已完成的答案采用了更有效的方法


请注意,前缀仅使用伪字符串搜索进行搜索。如果前缀是
your/directory
,也就是说,没有附加尾随斜杠,那么程序也会很高兴地删除
your/directory-that-you-want-to-remove-is-finally-not-t‌​他的一个

有关更多信息,请参见

您可以与一系列关键点一起使用(对于大量关键点,我发现这比使用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)

我觉得已经有一段时间了,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)
这将发出两个请求,一个请求获取文件夹中的对象,第二个请求删除所述文件夹中的所有对象


对Patrick的解决方案略有改进。您可能知道,
list_objects()
delete_objects()
的对象限制都是1000。这就是为什么您必须对列表进行分页并分块删除。这是非常通用的,您可以为
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)
以下是2018年(近2019年)版本:


如果在S3存储桶上启用了版本控制:

s3 = boto3.resource('s3')
bucket = s3.Bucket('mybucket')
bucket.object_versions.filter(Prefix="myprefix/").delete()

如果需要像我一样按对象内容进行过滤,以下是您的逻辑蓝图:

def get_s3_objects_批处理(s3:S3Client,**base_-kwargs):
kwargs=dict(MaxKeys=1000,**base_kwargs)
尽管如此:
响应=s3。列出对象(v2)(*kwargs)
#要生成每个文件:从response.get('Contents',[])中生成
产生响应。获取('Contents',[])
如果不是,则返回response.get('IsTruncated'):#在列表的末尾?
打破
continuation\u token=response.get('NextContinuationToken')
kwargs['ContinuationToken']=延续令牌
定义您的_过滤器(b):
引发未实现的错误()
session=boto3.session.session(profile\u name=profile\u name)
s3client=session.client('s3')
对于get_s3_对象_批次中的批次(s3client,Bucket=Bucket_name,Prefix=Prefix):
to_delete=[{'Key':obj['Key']}如果您的_过滤器(obj)]
如果要删除:
s3client.delete_对象(Bucket=Bucket_name,delete={'objects':to_delete})


如何删除目录?删除此目录中的所有文件时,是否会自动删除此目录?谢谢。。我已经完成了~@wadehuang-你能分享一下你关于删除文件夹的代码吗?如何删除s3文件夹中在python中已经存在2天的文件。在我的s3中有这个-bucket/1/backups/(10个文件)需要删除两天以前的所有文件这是迄今为止最快的解决方案。这是最快的解决方案,但是请记住,
list\u对象
不能返回超过1000个键,因此您需要多次运行此代码。如果您有超过1k个对象,可以使用paginator-请参阅下面的答案。@deepelement,它只在
bot3
中起作用,而不是两者都起作用。这很好,您可以通过将上面的代码放入lambda_处理程序函数中,从Python lambda运行它:
import boto3;def lambda_处理程序(事件、上下文):“上面的代码”。确保您授予Lambda从S3中删除的权限并延长超时时间。如果您想限制为一个“目录”,请使用
paginator.paginate()中的
前缀
关键字
查看所有选项:使用@Chad建议的
前缀
过滤器,我必须添加
如果项不是None
删除前检查(因为我的一些S3前缀不存在/没有对象)@pyCthon技术错误。再试一次。这是迄今为止最好的答案。有人可能会发现知道bucket.objects.all().delete()会清空整个bucket而不删除它,不管有多少对象(即不受影响,但限制为1000个项目)。请看:嗨,Raz,这对我不起作用,我只是得到了空的方括号,即[]遗憾的是,这不支持后缀:(最棒的是,此解决方案即使适用于1000多个对象。是否有办法打印要删除的内容的某些输出?我想先删除版本,然后删除当前版本。ex bucket.objects.filter(Prefix=“myprefix/”).delete();现在我只看到一个闪烁的光标,我不知道发生了什么。您必须执行类似于
文件\u to\u delete=bucket.object\u versions.filter(Prefix=“myprefix/”)
的操作,然后迭代
文件\u to\u delete
并调用print(),然后对其执行delete()。您必须修复代码缩进。
s3 = boto3.resource('s3')
bucket = s3.Bucket('mybucket')
bucket.object_versions.filter(Prefix="myprefix/").delete()
def remove(path):
    session = boto3.Session(
        aws_access_key_id = config["aws_access_key_id"],
        aws_secret_access_key = config["aws_secret_access_key"],
        region_name=config["region_name"],
    )
    s3 = session.client('s3')
    bucket = config["bucketName"]

    try:
        result = s3.delete_object(Bucket = bucket, Key=path)
    except Exception as e:
        print(e)