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

165

我需要用Python编写代码来从Amazon S3存储桶中删除所需文件。我能够连接到Amazon S3存储桶,也能保存文件,但是如何删除文件呢?


你是否在使用任何Python库来支持S3?或者你是直接在Python代码中使用REST或SOAP接口? - T.J. Crowder
1
我正在使用Python库boto.s3。 - Suhail
22个回答

175

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

import boto3

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

1
如果对象不存在,它会抛出错误吗? - Akash Tantri
3
@AkashTantri 我个人没有试过,但是文档上说它“删除空版本(如果存在)[...]。如果没有空版本,则Amazon S3不会删除任何对象。” 所以我猜它不会抛出错误。 如果你碰巧尝试了它(只需执行类似于s3.Object('existing-bucket', 'bogus-key').delete()的操作并查看发生了什么),也可以尝试s3.Object('bogus-bucket', 'bogus-key').delete() - Kohányi Róbert
1
运行得非常好,这就是Python的真正力量。 - yunus
1
这里的 your-key 是指 S3 上 your-bucket 中实际文件的名称吗? - Underoos
3
您可以使用它来检查文件是否存在,然后再删除它: obj_exists = list(s3.Bucket('bucket').objects.filter(Prefix='key')
if len(obj_exists) > 0 and obj_exists[0].key == 'key':
s3.Object('bucket','key').delete()
- dasilvadaniel
显示剩余4条评论

148

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

import boto3

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

7
@Rob,boto3文档误导了。如果对象是版本化的,它会创建一个删除标记。否则,它会删除该对象。 - jarmod
1
简洁明了。这可能是被接受的答案,并且绝对应该与@Kohányi Róbert的答案合并,因为两者都是最佳方法来完成任务。 - PaulB

95

我发现了另一种使用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
23
我喜欢我的文件中出现了 bucket.list() 这一行。 - Artur Sapek
为了使此代码片段按照所示工作,您还需要导入BucketKey。例如:from boto.s3.connection import S3Connection, Bucket, Key - Nick Chammas
我得到了以下错误信息:>>> 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。 - Harry Moreno
1
解决了问题并编写了解决方案 http://harrymoreno.com/2017/04/24/How-to-fill-and-empty-an-s3-bucket-with-python.html - Harry Moreno

29

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

我花了太长时间才找到答案,而答案其实很简单。


谢谢@user13441281,这正是我想要的和我喜欢的,纯Django魔法。 - Emad G

19

请尝试这段代码

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

10

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


5
我很惊讶居然没有这么简单的方法: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

使用S3FileSystem.rm函数在s3fs中。

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

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删除目录的方法? - Erik Hambardzumyan

4
以下是您可以使用的代码片段来删除存储桶:
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()

4

如果您希望以最简单的方式使用几行代码从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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接