Python 如何从AmazonS3 bucket中删除文件?
我需要用python编写代码,从AmazonS3存储桶中删除所需的文件。我可以连接到Amazon s3存储桶,也可以保存文件,但如何删除文件?通过哪个接口?使用REST界面,您只需: 通过:Python 如何从AmazonS3 bucket中删除文件?,python,amazon-s3,bucket,Python,Amazon S3,Bucket,我需要用python编写代码,从AmazonS3存储桶中删除所需的文件。我可以连接到Amazon s3存储桶,也可以保存文件,但如何删除文件?通过哪个接口?使用REST界面,您只需: 通过: 引用 纳尔逊 ,它应该会公开一个“delete”功能,比如。现在我已经使用Linux实用程序解决了这个问题。我在Python中这样使用它: delFile = 's3cmd -c /home/project/.s3cfg del s3://images/anon-images/small/' + file
引用
纳尔逊
,它应该会公开一个“delete”功能,比如。现在我已经使用Linux实用程序解决了这个问题。我在Python中这样使用它:
delFile = 's3cmd -c /home/project/.s3cfg del s3://images/anon-images/small/' + filename
os.system(delFile)
找到了使用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)
我很惊讶没有这么简单的方法:key.delete()
:
使用(并假设为AWS设置了凭据),以下操作将删除bucket中的指定对象:
import boto3
client = boto3.client('s3')
client.delete_object(Bucket='mybucketname', Key='myfile.whatever')
使用boto3
(当前版本为1.4.4)使用
这对我有用,试试看
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)
导入boto
导入系统
从boto.s3.key导入密钥
导入boto.s3.connection
AWS\u访问\u密钥\u ID=“”
AWS_SECRET_ACCESS_KEY=''
Bucketname='bucket_name'
conn=boto.s3.将_连接到_地区('us-east-2',
aws\u访问\u密钥\u id=aws\u访问\u密钥\u id,
aws_secret_access_key=aws_secret_access_key,
安全吗,
调用_format=boto.s3.connection.OrdinaryCallingFormat(),
)
bucket=conn.get_bucket(Bucketname)
k=钥匙(铲斗)
k、 key='要删除的文件名'
bucket.delete_键(k)
您可以使用aws cli:和一些unix命令来执行此操作
此aws cli命令应能正常工作:
aws s3 rm s3://<your_bucket_name> --exclude "*" --include "<your_regex>"
aws s3 ls s3://<your_bucket_name>/ | awk '{print $4}' | xargs -I% <your_os_shell> -c 'aws s3 rm s3:// <your_bucket_name> /% $1'
aws s3 rm s3://--排除“*”--包括“”
如果要包括子文件夹,则应添加标志--recursive
或使用unix命令:
aws s3 rm s3://<your_bucket_name> --exclude "*" --include "<your_regex>"
aws s3 ls s3://<your_bucket_name>/ | awk '{print $4}' | xargs -I% <your_os_shell> -c 'aws s3 rm s3:// <your_bucket_name> /% $1'
aws s3 ls s3://| awk'{print$4}'| xargs-I%-c'aws s3 rm s3:///%$1'
说明:
列出bucket上的所有文件--pipe-->
获取第四个参数(文件名)--pipe-->//您可以使用linux命令替换它以匹配您的模式
使用aws cli运行删除脚本
试着寻找一个合适的答案,因为Boto3可能会不时变化。我使用了我的\u桶。删除\u对象():
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
}
]
}
)
如果您试图使用自己的本地主机控制台删除文件,那么可以尝试运行此python脚本,前提是您已经在系统中分配了访问id和密钥
导入boto3
#我的习俗
aws\u m=boto3.session.session(profile\u name=“本地主机上的配置文件名”)
客户机=aws_m.客户机('s3')
#删除前列出bucket对象
响应=client.list\u对象(
Bucket='your-Bucket-name'
)
对于响应中的x.get(“内容”,无):
打印(x.get(“键”,无));
#删除bucket对象
response=client.delete\u对象(
Bucket='your-Bucket-name',
Key='mydocs.txt'
)
#删除后列出bucket对象
响应=client.list\u对象(
Bucket='your-Bucket-name'
)
对于响应中的x.get(“内容”,无):
打印(x.get(“键”,无));
欢迎来到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}")
我花了太长时间才找到答案,答案就这么简单。以下内容对我来说很有用(基于Django模型的示例,但您可以自行使用delete
方法的代码)
最简单的方法是:
import boto3
s3 = boto3.resource("s3")
bucket_source = {
'Bucket': "my-bcuket",
'Key': "file_path_in_bucket"
}
s3.meta.client.delete(bucket_source)
下面是您可以用来删除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()
请尝试此代码
import boto3
s3 = boto3.client('s3')
s3.delete_object(Bucket="s3bucketname", Key="s3filepath")
使用中的函数
您可以一次删除一个或多个文件:
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
您使用哪个(如果有的话)Python库来支持S3?或者您要直接使用Python代码中的REST或SOAP接口?我正在使用Python库boto.s3是的,我正在使用该Python库,但这会删除该文件吗?我应该这样做:k.key='images/anon images/small/'+文件名k.delete_key()是否正确?请让我知道。@Suhail:我还没有用过那个库,但从我链接的源代码来看,它实际上是通过REST接口调用DELETE
。因此,是的,尽管名称为“delete_key”(我同意这一点尚不清楚),它实际上是在删除该键引用的对象。删除许多名称中带有公共前缀的文件怎么样?S3是否允许对这种情况进行批量删除,或者必须一个一个地删除它们(这很慢)?@Saman:我不是S3专家,但据我所知,您只能删除特定的文件。但是你可能想把它作为一个问题来问,所以它会引起S3专家的注意。它有两个视图:)如果你想删除bucket中的所有内容,你可以这样做:对于b.list()中的x:b.delete_key(x.key)
我喜欢我的文件中的bucket.list()是bucket.list()
为了让这个代码片段像现在这样工作,你还需要导入bucket
和key
。例如:来自boto.s3.connection导入s3连接,Bucket,Key
我从boto.s3.connection导入s3连接,Bucket,Key回溯(最近一次调用):文件“”,第1行,在ImportError中:没有名为boto.s3.connection的模块
请更新boto3的答案找出了它并编写了一个解决方案调用子shell与s3通信并不完全是pythonic(库或直接HTTP事务会更优雅),但它仍然可以工作。我认为它不值得投否决票+1.@Rob boto3文档具有误导性。如果对象已版本化,它将创建一个删除标记。否则将删除该对象。干净且简单。可能是可接受的答案,并且肯定应该与@Kohányi Róbert的答案合并,因为两者都是完成任务的最佳方法。如果对象不存在,它会抛出错误吗?@AkashTantri我个人没有尝试过,但医生说它会删除空版本(如果有)[…]如果没有空版本,AmazonS3不删除任何对象。所以我猜它不会抛出错误。如果你碰巧尝试一下(只要做点什么就行了)
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()
import boto3
s3 = boto3.client('s3')
s3.delete_object(Bucket="s3bucketname", Key="s3filepath")
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