【问题标题】:how to delete files from amazon s3 bucket?如何从亚马逊 s3 存储桶中删除文件?
【发布时间】:2011-03-09 14:53:01
【问题描述】:

我需要用 python 编写代码,从 Amazon s3 存储桶中删除所需的文件。我可以连接到 Amazon s3 存储桶,也可以保存文件,但是如何删除文件?

【问题讨论】:

  • 您使用哪个(如果有)Python 库来支持 S3?还是直接使用 Python 代码中的 REST 或 SOAP 接口?
  • 我正在使用python库boto.s3

标签: python amazon-s3 bucket


【解决方案1】:

使用boto3(当前版本1.4.4)使用S3.Object.delete()

import boto3

s3 = boto3.resource('s3')
s3.Object('your-bucket', 'your-key').delete()

【讨论】:

  • 如果对象不存在会报错吗?
  • @AkashTantri 我没有亲自尝试过,但文档说它 删除了空版本(如果有的话)[...] 如果没有空版本,亚马逊S3 不会删除任何对象。 所以我猜它不会抛出错误。如果您碰巧尝试过(只需执行s3.Object('existing-bucket', 'bogus-key').delete() 之类的操作,看看会发生什么。也可以尝试s3.Object('bogus-bucket', 'bogus-key').delete()
  • 像魅力一样工作,这就是python的真正力量
  • @yunus 这是认真的评论吗?
  • 这里的your-key是指S3上your-bucket中的实际文件名吗?
【解决方案2】:

使用Python boto3 SDK(并假设为 AWS 设置了凭证),以下将删除存储桶中的指定对象:

import boto3

client = boto3.client('s3')
client.delete_object(Bucket='mybucketname', Key='myfile.whatever')

【讨论】:

  • @Rob boto3 文档具有误导性。如果对象是版本化的,它将创建一个删除标记。否则它将删除该对象。
  • 干净简单。可能是公认的答案,并且绝对应该与@Kohányi Róbert 的答案合并,因为两者都是完成任务的最佳方法。
【解决方案3】:

找到了另一种使用 boto 的方法:

from boto.s3.connection import S3Connection, Bucket, Key

conn = S3Connection(AWS_ACCESS_KEY, AWS_SECERET_KEY)

b = Bucket(conn, S3_BUCKET_NAME)

k = Key(b)

k.key = 'images/my-images/'+filename

b.delete_key(k)

【讨论】:

  • 如果您想删除存储桶中的所有内容,您可以这样做:for x in b.list(): b.delete_key(x.key)
  • 我喜欢在我的文件中它原来是bucket.list()
  • 为了让这段代码 sn-p 能够正常工作,您还需要导入 BucketKey。如:from boto.s3.connection import S3Connection, Bucket, Key
  • 我收到>>> from boto.s3.connection import S3Connection, Bucket, Key Traceback (most recent call last): File "<console>", line 1, in <module> ImportError: No module named boto.s3.connection 请更新boto3的答案
  • 想通了并写了一个解决方案harrymoreno.com/2017/04/24/…
【解决方案4】:

欢迎来到 2020 年,这是 Python/Django 中的答案:

from django.conf import settings 
import boto3   
s3 = boto3.client('s3')
s3.delete_object(Bucket=settings.AWS_STORAGE_BUCKET_NAME, Key=f"media/{item.file.name}")

我花了很长时间才找到答案,就这么简单。

【讨论】:

    【解决方案5】:

    请试试这个代码

    import boto3   
    s3 = boto3.client('s3')
    s3.delete_object(Bucket="s3bucketname", Key="s3filepath")
    

    【讨论】:

      【解决方案6】:

      尝试查找updated method,因为 Boto3 可能会不时更改。我使用了 my_bucket.delete_objects()

      import boto3
      from boto3.session import Session
      
      session = Session(aws_access_key_id='your_key_id',
                        aws_secret_access_key='your_secret_key')
      
      # s3_client = session.client('s3')
      s3_resource = session.resource('s3')
      my_bucket = s3_resource.Bucket("your_bucket_name")
      
      response = my_bucket.delete_objects(
          Delete={
              'Objects': [
                  {
                      'Key': "your_file_name_key"   # the_name of_your_file
                  }
              ]
          }
      )
      
      

      【讨论】:

        【解决方案7】:

        我很惊讶没有这么简单的方法:key.delete()

        from boto.s3.connection import S3Connection, Bucket, Key
        
        conn = S3Connection(AWS_ACCESS_KEY, AWS_SECERET_KEY)
        bucket = Bucket(conn, S3_BUCKET_NAME)
        k = Key(bucket = bucket, name=path_to_file)
        k.delete()
        

        【讨论】:

          【解决方案8】:

          通过哪个接口?使用 REST 接口,您只需 send a delete:

          DELETE /ObjectName HTTP/1.1
          Host: BucketName.s3.amazonaws.com
          Date: date
          Content-Length: length
          Authorization: signatureValue
          

          通过SOAP interface

          <DeleteObject xmlns="http://doc.s3.amazonaws.com/2006-03-01">
            <Bucket>quotes</Bucket>
            <Key>Nelson</Key>
            <AWSAccessKeyId> 1D9FVRAYCP1VJEXAMPLE=</AWSAccessKeyId>
            <Timestamp>2006-03-01T12:00:00.183Z</Timestamp>
            <Signature>Iuyz3d3P0aTou39dzbqaEXAMPLE=</Signature>
          </DeleteObject>
          

          如果您使用的是 Python 库 like boto,它应该公开“删除”功能,例如 delete_key()

          【讨论】:

          • 是的,我正在使用那个 python 库,但是会删除文件吗?我应该这样做吗: k.key = 'images/anon-images/small/'+filename k.delete_key() 这是正确的吗?请告诉我。
          • @Suhail:我没有使用过那个库,但是从我链接的源代码来看,它实际上在做的是通过 REST 接口调用DELETE。所以是的,尽管名称为“delete_key”(我同意不清楚),但它实际上是在删除 referenced 的对象。
          • 如何删除名称中具有共同前缀的大量文件? S3 是否允许针对这种情况进行一些批量删除,或者必须逐个删除它们(这很慢)?
          • @Shaman:我不是 S3 专家,但据我知道,您只能删除特定文件。但您可能想真正提出这个问题,以便引起 S3 专家的注意。
          • 在这里发表评论后,我添加了这样一个问题。它还有 2 个视图 :)
          【解决方案9】:

          最简单的方法是:

          import boto3
          s3 = boto3.resource("s3")
          bucket_source = {
                      'Bucket': "my-bcuket",
                      'Key': "file_path_in_bucket"
                  }
          s3.meta.client.delete(bucket_source)
          

          【讨论】:

            【解决方案10】:

            下面是代码sn-p,可以用来删除bucket,

            import boto3, botocore
            from botocore.exceptions import ClientError
            
            s3 = boto3.resource("s3",aws_access_key_id='Your-Access-Key',aws_secret_access_key='Your-Secret-Key')
            s3.Object('Bucket-Name', 'file-name as key').delete()
            

            【讨论】:

              【解决方案11】:

              现在我已经通过使用 Linux 实用程序 s3cmd 解决了这个问题。我在 Python 中是这样使用的:

              delFile = 's3cmd -c /home/project/.s3cfg del s3://images/anon-images/small/' + filename
              os.system(delFile)
              

              【讨论】:

              • 调用子shell 与S3 通信并不完全是pythonic(库或直接HTTP 事务会更优雅),但它仍然有效。我认为它不值得一票否决。 +1。
              【解决方案12】:

              对我有用,试试吧。

              import boto
              import sys
              from boto.s3.key import Key
              import boto.s3.connection
              
              AWS_ACCESS_KEY_ID = '<access_key>'
              AWS_SECRET_ACCESS_KEY = '<secret_access_key>'
              Bucketname = 'bucket_name' 
              
              conn = boto.s3.connect_to_region('us-east-2',
                      aws_access_key_id=AWS_ACCESS_KEY_ID,
                      aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
                      is_secure=True,              
                      calling_format = boto.s3.connection.OrdinaryCallingFormat(),
                      )
              bucket = conn.get_bucket(Bucketname)
              
              k = Key(bucket)
              
              k.key = 'filename to delete'
              bucket.delete_key(k)   
              

              【讨论】:

                【解决方案13】:

                您可以使用 aws cli:https://aws.amazon.com/cli/ 和一些 unix 命令来完成。

                这个 aws cli 命令应该可以工作:

                aws s3 rm s3://<your_bucket_name> --exclude "*" --include "<your_regex>" 
                

                如果你想包含子文件夹,你应该添加标志 --recursive

                或使用 unix 命令:

                aws s3 ls s3://<your_bucket_name>/ | awk '{print $4}' | xargs -I%  <your_os_shell>   -c 'aws s3 rm s3:// <your_bucket_name>  /% $1'
                

                解释:

                1. 列出存储桶上的所有文件--pipe-->
                2. 获取第四个参数(文件名)--pipe--> //你可以用linux命令替换它来匹配你的模式
                3. 使用 aws cli 运行删除脚本

                【讨论】:

                  【解决方案14】:

                  如果您尝试使用自己的本地主机控制台删除文件,那么您可以尝试运行此 python 脚本,假设您已经在系统中分配了访问 ID 和密钥

                  import boto3
                  
                  #my custom sesssion
                  aws_m=boto3.session.Session(profile_name="your-profile-name-on-local-host")
                  client=aws_m.client('s3')
                  
                  #list bucket objects before deleting 
                  response = client.list_objects(
                      Bucket='your-bucket-name'
                  )
                  for x in response.get("Contents", None):
                      print(x.get("Key",None));
                  
                  #delete bucket objects
                  response = client.delete_object(
                      Bucket='your-bucket-name',
                      Key='mydocs.txt'
                  )
                  
                  #list bucket objects after deleting
                  response = client.list_objects(
                      Bucket='your-bucket-name'
                  )
                  for x in response.get("Contents", None):
                      print(x.get("Key",None));
                  

                  【讨论】:

                    【解决方案15】:

                    s3fs 中使用S3FileSystem.rm 函数。

                    您可以一次删除一个文件或多个文件:

                    import s3fs
                    file_system = s3fs.S3FileSystem()
                    
                    file_system.rm('s3://my-bucket/foo.txt')  # single file
                    
                    files = ['s3://my-bucket/bar.txt', 's3://my-bucket/baz.txt']
                    file_system.rm(files)  # several files
                    

                    【讨论】:

                    • 有没有办法使用 s3fs 删除目录?
                    【解决方案16】:

                    如果您想通过几行代码以最简单的方式从 s3 存储桶中删除所有文件,请使用此方法。

                    import boto3
                    
                    s3 = boto3.resource('s3', aws_access_key_id='XXX', aws_secret_access_key= 'XXX')
                    bucket = s3.Bucket('your_bucket_name')
                    bucket.objects.delete()
                    

                    【讨论】:

                      【解决方案17】:

                      以下内容对我有用(基于 Django 模型的示例,但您几乎可以单独使用 delete 方法的代码)。

                      import boto3
                      from boto3.session import Session
                      from django.conf import settings
                      
                      class Video(models.Model):
                          title=models.CharField(max_length=500)
                          description=models.TextField(default="")
                          creation_date=models.DateTimeField(default=timezone.now)
                          videofile=models.FileField(upload_to='videos/', null=True, verbose_name="")
                          tags = TaggableManager()
                      
                          actions = ['delete']
                      
                          def __str__(self):
                              return self.title + ": " + str(self.videofile)
                      
                          def delete(self, *args, **kwargs):
                              session = Session (settings.AWS_ACCESS_KEY_ID, settings.AWS_SECRET_ACCESS_KEY)
                              s3_resource = session.resource('s3')
                              s3_bucket = s3_resource.Bucket(settings.AWS_STORAGE_BUCKET_NAME)
                      
                              file_path = "media/" + str(self.videofile)
                              response = s3_bucket.delete_objects(
                                  Delete={
                                      'Objects': [
                                          {
                                              'Key': file_path
                                          }
                                      ]
                                  })
                              super(Video, self).delete(*args, **kwargs)
                      

                      【讨论】:

                        【解决方案18】:

                        2021 年更新 - 我在这方面遇到了困难,但它就是这么简单。

                          def delete_object(self,request):
                             s3 = boto3.resource('s3',
                                 aws_access_key_id=AWS_UPLOAD_ACCESS_KEY_ID,
                                 aws_secret_access_key= AWS_UPLOAD_SECRET_KEY,
                             )
                             s3.Object('your-bucket', 'your-key}').delete()
                        

                        确保在您的 boto3 资源中添加凭据

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 2013-05-23
                          • 2013-12-29
                          • 2011-06-26
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2022-07-02
                          • 1970-01-01
                          相关资源
                          最近更新 更多