【问题标题】:s3 delete key with boto3.clients3 使用 boto3.client 删除密钥
【发布时间】:2020-09-11 00:38:17
【问题描述】:

这将删除 s3 存储桶中的所有对象

s3_b=boto3.client("s3")
objects=s3_b.list_objects(Bucket="bucket_name")["Contents"]
for obj in objects:
    s3_b.delete_object(Bucket='bucket_name',Key=obj["Key"])

是否有类似的方法可以删除具有特定键路径的对象,例如 s3://bucket_name/folder1/folder2/folder3/folder4,我想删除文件夹 4 中的所有对象

编辑:
是否可以在同一个循环中删除两个不同路径中的对象
例如:'folder1/folder2/folder3/folder4''folder1/folder2/folder3/folder5'

【问题讨论】:

    标签: amazon-web-services amazon-s3 aws-lambda boto3


    【解决方案1】:

    您可以使用.delete_objects 并将对象列表作为参数传递: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.delete_objects

    【讨论】:

      【解决方案2】:

      您可以使用filter。例如:

      import boto3
      
      s3r = boto3.resource('s3')
      
      bucket = s3r.Bucket('bucket_name')
      
      for object in bucket.objects.filter(Prefix='folder1/folder2/folder3/folder4'):
          print(object)
          #object.delete() # uncomment to delete
      

      【讨论】:

      • 谢谢@Marcin,boto3.resource('s3')boto3.client("s3") 有何不同,我在使用boto3.client("s3") 删除后执行了一些其他操作,同时使用资源和客户端是否会产生影响功能
      • @pc_pyr boto3.resource 是更 Python 的、更高级别的 aws 接口。 boto3.client 是 aws api 的低级接口。您可以在一个程序中同时使用resourceclient。我不知道使用它们会导致问题的任何问题。
      • 有没有一种方法可以用这种方法指定两条路径(在同一个循环迭代中),例如。 Prefix='folder1/folder2/folder3/folder4'Prefix='folder1/folder2/folder3/folder5' ,谢谢@Marcin,还在帖子中添加了这个示例以更好地格式化
      • @pc_pyr 您必须运行两次过滤命令。我不认为您可以在一个过滤器中提供多个前缀。
      • bucket.objects.filter(Prefix='folder1/folder2/folder3/folder4').delete() 似乎也可以在没有 for 循环的情况下工作,了解两者之间的区别会很有帮助:使用无循环和在循环中迭代谢谢@Marcin
      猜你喜欢
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-19
      • 2019-07-01
      • 2016-02-23
      相关资源
      最近更新 更多