【问题标题】:How to delete a folder and its contents on Amazon S3 using Python如何使用 Python 删除 Amazon S3 上的文件夹及其内容
【发布时间】:2019-12-11 18:28:38
【问题描述】:

由于某种原因,我的回复只给了我空方括号,即 [ ] 并且没有任何反应。

这是我的代码:

session = boto3.Session(aws_access_key_id=awsaccesskey,aws_secret_access_key=awssecretkey,region_name='eu-west-1')
s3 = session.resource('s3')
b = s3.Bucket(s3bucket)
r = b.objects.filter(Prefix=s3path).delete()
return(r)

更新:根据 John 的建议,我尝试创建一个测试存储桶,但不幸的是我收到了权限被拒绝错误。所以我做了以下事情:

  • 在我有权访问的存储桶下创建了一个文件夹,名为“test”
  • 使用 Prefix='/test/' 执行上述代码

这次我确实收到了一个 ResponseMetadata 对象,而不是空括号。不过我还是很疑惑。我的 HTTPStatusCode 是 200。但是当它告诉我它删除了什么时,它会说:

  • '已删除':[{'Key': '/test/table_name.dat'}, {'Key': '/test/table_name.txt'}]}]

    我想我不明白这段代码的预期功能。我期待它删除我在存储桶中创建为根文件夹的空“测试”文件夹。即 bucket/test/ 但它似乎已经在我的整个存储桶中搜索了名为“test”的文件夹并删除了其中的对象??

【问题讨论】:

  • 旁注:建议您不要在您的代码中包含访问密钥/秘密密钥。相反,通过运行 aws configure 将凭据存储在凭据文件中。
  • 你的代码对我来说很好用,我有自己的存储桶和路径。您可能想创建一个测试存储桶,上传一些对象并重试。如果失败,请编辑您的问题以描述您采取的确切步骤,以便我们可以尝试重现您的情况。
  • 感谢@JohnRotenstein 测试我的代码并确认它对你有用。我会试试你的建议。

标签: python amazon-s3 boto3


【解决方案1】:

首先以下是一些提示:永远不要在 boto3 客户端对象中硬编码访问凭据。

S3 中没有文件夹。相反,这些键形成了一个平面命名空间。但是,名称中带有斜线的键会在某些程序中特别显示,包括 AWS 控制台(例如,请参阅 Amazon S3 boto - 如何创建文件夹?)。

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

bucket.list(prefix='your/directory/') 中的键: key.delete()

您可以参考此链接,此处捆绑了一个示例: https://docs.aws.amazon.com/code-samples/latest/catalog/python-s3-delete_object.py.html

import logging
import boto3
from botocore.exceptions import ClientError

def delete_object(bucket_name, object_name):
"""Delete an object from an S3 bucket

:param bucket_name: string
:param object_name: string
:return: True if the referenced object was deleted, otherwise False
"""

# Delete the object
s3 = boto3.client('s3')
try:
    s3.delete_object(Bucket=bucket_name, Key=object_name)
except ClientError as e:
    logging.error(e)
    return False
return True

【讨论】:

    【解决方案2】:
    import boto3
    s3 = boto3.resource('s3')
    my_bucket = s3.Bucket('mybucket')
    
    for obj in my_bucket.objects.all():
        print(obj)
    

    【讨论】:

    • 此代码不起作用。 s3.Bucket() 命令需要存储桶的名称,而不是路径。
    猜你喜欢
    • 1970-01-01
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    • 2012-07-10
    • 1970-01-01
    • 2012-03-28
    • 2012-04-07
    相关资源
    最近更新 更多