Tôi cần viết mã bằng python sẽ xóa tệp được yêu cầu khỏi nhóm Amazon s3. Tôi có thể kết nối với bộ chứa Amazon s3 và cũng có thể lưu tệp, nhưng làm cách nào để xóa tệp?
Tôi cần viết mã bằng python sẽ xóa tệp được yêu cầu khỏi nhóm Amazon s3. Tôi có thể kết nối với bộ chứa Amazon s3 và cũng có thể lưu tệp, nhưng làm cách nào để xóa tệp?
Câu trả lời:
Đang sử dụng boto3
(hiện tại là phiên bản 1.4.4) S3.Object.delete()
.
import boto3
s3 = boto3.resource('s3')
s3.Object('your-bucket', 'your-key').delete()
s3.Object('existing-bucket', 'bogus-key').delete()
và xem những gì sẽ xảy ra Cũng thử. s3.Object('bogus-bucket', 'bogus-key').delete()
.
your-key
đây có nghĩa là tên tập tin thực tế trong your-bucket
trên S3?
đã tìm thấy một cách khác để làm điều đó bằng cách sử dụng 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()
Bucket
và nhập Key
. Như trong: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
vui lòng cập nhật câu trả lời cho boto3
Sử dụng Python boto3 SDK (và giả sử thông tin đăng nhập được thiết lập cho AWS), thao tác sau sẽ xóa một đối tượng được chỉ định trong một nhóm:
import boto3
client = boto3.client('s3')
client.delete_object(Bucket='mybucketname', Key='myfile.whatever')
Chào mừng đến với năm 2020, đây là câu trả lời bằng 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}")
Tôi đã mất quá nhiều thời gian để tìm ra câu trả lời và nó chỉ đơn giản như thế này.
Cố gắng tìm kiếm một phương pháp cập nhật , vì Boto3 có thể thay đổi theo thời gian. Tôi đã sử dụng 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
}
]
}
)
Qua giao diện nào? Sử dụng giao diện REST, bạn chỉ cần gửi một lệnh xóa :
DELETE /ObjectName HTTP/1.1
Host: BucketName.s3.amazonaws.com
Date: date
Content-Length: length
Authorization: signatureValue
Qua giao diện 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>
Nếu bạn đang sử dụng thư viện Python như boto , thì nó sẽ hiển thị tính năng "xóa", chẳng hạn như delete_key()
.
DELETE
cuộc gọi thông qua giao diện REST. Vì vậy, có, mặc dù tên "delete_key" (mà tôi đồng ý là không rõ ràng), nó thực sự xóa đối tượng được tham chiếu bởi khóa.
Hiện tại, tôi đã giải quyết vấn đề bằng cách sử dụng tiện ích s3cmd của Linux . Tôi đã sử dụng nó như thế này trong Python:
delFile = 's3cmd -c /home/project/.s3cfg del s3://images/anon-images/small/' + filename
os.system(delFile)
Nó làm việc cho tôi thử nó.
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)
bạn có thể làm điều đó bằng cách sử dụng aws cli: https://aws.amazon.com/cli/ và một số lệnh unix.
Đây là lệnh cli sẽ hoạt động:
aws s3 rm s3://<your_bucket_name> --exclude "*" --include "<your_regex>"
nếu bạn muốn bao gồm các thư mục con, bạn nên thêm cờ --recursive
hoặc với các lệnh 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'
giải trình:
nếu bạn đang cố gắng xóa tệp bằng bảng điều khiển máy chủ cục bộ của riêng mình thì bạn có thể thử chạy tập lệnh python này giả sử rằng bạn đã chỉ định id truy cập và khóa bí mật của mình trong hệ thống
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));
Phần sau phù hợp với tôi (dựa trên ví dụ cho mô hình Django, nhưng bạn có thể sử dụng khá nhiều mã của delete
phương pháp này).
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)
vui lòng thử mã này
import boto3
s3 = boto3.client('s3')
s3.delete_object(Bucket="s3bucketname", Key="s3filepath")