如何从Amazon S3存储桶中删除文件?


90

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


您使用哪个(如果有)Python库来获得S3支持?还是要直接转到Python代码中的REST或SOAP接口?
TJ Crowder 2010年

1
我正在使用python库boto.s3
Suhail

Answers:


94

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

import boto3

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

1
如果对象不存在,会抛出错误吗?
阿卡什·坦特里

2
@AkashTantri我还没有亲自尝试过,但是文档说它会删除空版本(如果有)[...]如果没有空版本,Amazon S3不会删除任何对象。所以我的猜测是它不会引发错误。如果您碰巧尝试了一下(只需做类似的事情,s3.Object('existing-bucket', 'bogus-key').delete()然后看看会发生什么。也请尝试s3.Object('bogus-bucket', 'bogus-key').delete()。)
KohányiRóbert19年

就像魅力一样工作,这就是python的真正力量
yunus

@yunus这是一个严肃的评论吗?
亨利·亨林森

your-key这里是否表示your-bucketS3上的实际文件名?
Underoos

91

找到了另一种使用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)

10
如果您想删除存储桶中的所有内容,则可以执行以下操作:for x in b.list(): b.delete_key(x.key)
jontsai 2012年

19
我喜欢我的档案中的样子bucket.list()
Artur Sapek

为了使此代码段按所显示的那样工作,您还需要导入BucketKey。如:from boto.s3.connection import S3Connection, Bucket, Key
Nick Chammas 2014年

我得到了>>> 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的答案
哈里·莫雷诺

1
想通了,并写了一个解决方案harrymoreno.com/2017/04/24/...
哈利·莫雷诺

73

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

import boto3

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

6
@Rob boto3文档具有误导性。如果对象版本化,它将创建一个删除标记。否则将删除该对象。
jarmod

1
干净简单。可能是被接受的答案,并且绝对应该与@KohányiRóbert的答案合并,因为两者都是完成任务的最佳方法。
PaulB

14

欢迎来到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}")

花了我很长时间才找到答案,它是如此简单。


4

我很惊讶没有这种简单的方法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()

4

尝试寻找一种更新的方法,因为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
            }
        ]
    }
)


3

通过哪个接口?使用REST接口,您只需发送一个delete即可

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

通过SOAP接口

<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>

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


是的,我正在使用该python库,但是会删除该文件吗?我应该这样吗:k.key ='images / anon-images / small /'+文件名k.delete_key()这样正确吗?请告诉我。
Suhail 2010年

@Suhail:我没有使用过该库,但是从链接的源来看,它实际上是在DELETE通过REST接口进行调用。因此,是的,尽管名称为“ delete_key”(我同意不清楚),但实际上是在删除键所引用的对象。
TJ Crowder 2010年

1
删除名称中具有通用前缀的大量文件该怎么办?S3是否允许这种情况下进行一些批量删除,还是必须一一删除(很慢)?
Illarion Kovalchuk'7

@萨满:我不是S3专家,但据我所知,您只能删除特定文件。但是您实际上可能想提出一个问题,以便引起S3专家的注意。
TJ Crowder

在这里发表评论后,我添加了这样的问题。它拥有2个视图:)
Illarion Kovalchuk 2010年

2

最简单的方法是:

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

1

目前,我已经使用Linux实用程序s3cmd解决了该问题。我在Python中这样使用它:

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

1
调用子外壳程序与S3进行通信并不是完全pythonic的(库或直接HTTP事务会更优雅),但它仍然有效。我认为这不应该被否决。+1。
Randall Cook

1

尝试一下对我有用。

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)   

1

您可以使用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运行删除脚本

1

如果您尝试使用自己的本地主机控制台删除文件,则可以尝试运行此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));

0

以下代码对我有用(基于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)

0

以下是可用于删除存储桶的代码段,

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()

0

请尝试此代码

import boto3   
s3 = boto3.client('s3')
s3.delete_object(Bucket="s3bucketname", Key="s3filepath")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.