ฉันต้องการเขียนโค้ดใน python ซึ่งจะลบไฟล์ที่ต้องการออกจากที่เก็บข้อมูล Amazon s3 ฉันสามารถเชื่อมต่อกับที่เก็บข้อมูล Amazon s3 และยังบันทึกไฟล์ได้ แต่ฉันจะลบไฟล์ได้อย่างไร
ฉันต้องการเขียนโค้ดใน python ซึ่งจะลบไฟล์ที่ต้องการออกจากที่เก็บข้อมูล Amazon s3 ฉันสามารถเชื่อมต่อกับที่เก็บข้อมูล Amazon s3 และยังบันทึกไฟล์ได้ แต่ฉันจะลบไฟล์ได้อย่างไร
คำตอบ:
การใช้boto3
(รุ่นปัจจุบัน 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()
ดูว่าเกิดอะไรขึ้นลองดูs3.Object('bogus-bucket', 'bogus-key').delete()
ด้วย
your-key
นี่หมายถึงชื่อไฟล์จริงในyour-bucket
S3 หรือไม่
พบอีกหนึ่งวิธีในการทำโดยใช้ 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
และKey
เช่นกัน เช่นเดียวกับ: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
การใช้Python boto3 SDK (และสมมติว่ามีการตั้งค่าข้อมูลรับรองสำหรับ AWS) สิ่งต่อไปนี้จะลบวัตถุที่ระบุในที่เก็บข้อมูล:
import boto3
client = boto3.client('s3')
client.delete_object(Bucket='mybucketname', Key='myfile.whatever')
ยินดีต้อนรับสู่ปี 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}")
ฉันใช้เวลานานเกินไปในการค้นหาคำตอบและมันก็ง่ายอย่างนี้
ฉันแปลกใจที่ไม่มีวิธีง่ายๆแบบนี้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()
พยายามมองหาวิธีการที่อัปเดตเนื่องจาก 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
}
]
}
)
ผ่านอินเทอร์เฟซใด ใช้อินเทอร์เฟซ REST คุณเพียงแค่ส่งการลบ :
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ก็ควรเปิดเผยคุณลักษณะ "ลบ" delete_key()
เช่น
DELETE
โทรผ่านอินเทอร์เฟซ REST ใช่แม้ว่าชื่อ "delete_key" (ซึ่งฉันยอมรับว่าไม่ชัดเจน) แต่ก็เป็นการลบวัตถุที่อ้างถึงโดยคีย์จริงๆ
วิธีที่ง่ายที่สุดคือ:
import boto3
s3 = boto3.resource("s3")
bucket_source = {
'Bucket': "my-bcuket",
'Key': "file_path_in_bucket"
}
s3.meta.client.delete(bucket_source)
โปรดลองใช้รหัสนี้
import boto3
s3 = boto3.client('s3')
s3.delete_object(Bucket="s3bucketname", Key="s3filepath")
มันใช้ได้ผลสำหรับฉันลองดู
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)
คุณสามารถทำได้โดยใช้ 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'
คำอธิบาย:
หากคุณพยายามลบไฟล์โดยใช้คอนโซลโฮสต์ภายในของคุณเองคุณสามารถลองเรียกใช้สคริปต์ python นี้โดยสมมติว่าคุณได้กำหนดรหัสการเข้าถึงและคีย์ลับในระบบแล้ว
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));
สิ่งต่อไปนี้ใช้ได้ผลสำหรับฉัน (ตามตัวอย่างของโมเดล 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)
ด้านล่างนี้คือข้อมูลโค้ดที่คุณสามารถใช้เพื่อลบที่เก็บข้อมูล
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()