วิธีลบไฟล์จากถัง amazon s3


92

ฉันต้องการเขียนโค้ดใน python ซึ่งจะลบไฟล์ที่ต้องการออกจากที่เก็บข้อมูล Amazon s3 ฉันสามารถเชื่อมต่อกับที่เก็บข้อมูล Amazon s3 และยังบันทึกไฟล์ได้ แต่ฉันจะลบไฟล์ได้อย่างไร


คุณใช้ไลบรารี Python ใด (ถ้ามี) สำหรับการสนับสนุน S3 หรือคุณกำลังจะตรงไปยังอินเทอร์เฟซ REST หรือ SOAP ในโค้ด Python ของคุณ?
TJ Crowder

1
ฉันใช้ python library boto.s3
Suhail

คำตอบ:


98

การใช้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ányiRóbert

1
ทำงานเหมือนเสน่ห์ Thats อำนาจที่แท้จริงของงูหลาม
yunus

@yunus นี่คือความคิดเห็นที่รุนแรง?
Henry Henrinson

ที่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

19
ฉันชอบที่ในไฟล์ของฉันกลายเป็นbucket.list()
Artur Sapek

เพื่อให้ข้อมูลโค้ดนี้ทำงานได้ตามที่นำเสนอคุณจะต้องนำเข้าBucketและKeyเช่นกัน เช่นเดียวกับ: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
คิดออกและเขียนวิธีแก้ปัญหาharrymoreno.com/2017/04/24/…
Harry Moreno

76

การใช้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

16

ยินดีต้อนรับสู่ปี 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 /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()เช่น


ใช่ฉันใช้ไลบรารี python นั้น แต่จะลบไฟล์หรือไม่ ฉันควรทำเช่นนี้: k.key = 'images / anon-images / small /' + ชื่อไฟล์ k.delete_key () ถูกต้องหรือไม่ โปรดแจ้งให้เราทราบ
Suhail

@Suhail: ฉันไม่ได้ใช้ไลบรารีนั้น แต่จากแหล่งที่ฉันเชื่อมโยงสิ่งที่มันทำคือการDELETEโทรผ่านอินเทอร์เฟซ REST ใช่แม้ว่าชื่อ "delete_key" (ซึ่งฉันยอมรับว่าไม่ชัดเจน) แต่ก็เป็นการลบวัตถุที่อ้างถึงโดยคีย์จริงๆ
TJ Crowder

1
แล้วการลบไฟล์จำนวนมากด้วยคำนำหน้าชื่อทั่วไปล่ะ? S3 อนุญาตให้ลบบางส่วนสำหรับกรณีดังกล่าวหรือไม่หรือต้องลบทีละรายการ (ซึ่งช้า)?
Illarion Kovalchuk

@ Shaman: ฉันไม่ใช่ผู้เชี่ยวชาญ S3 แต่เท่าที่ฉันรู้คุณสามารถลบไฟล์เฉพาะได้เท่านั้น แต่คุณอาจต้องการถามเป็นคำถามเพื่อให้ได้รับความสนใจจากผู้เชี่ยวชาญ S3
TJ Crowder

หลังจากแสดงความคิดเห็นที่นี่ฉันได้เพิ่มคำถามดังกล่าวแล้ว มี 2 ​​วิวแล้ว :)
Illarion Kovalchuk

2

วิธีที่ง่ายที่สุดคือ:

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


1

สำหรับตอนนี้ผมได้แก้ไขปัญหาโดยใช้โปรแกรมอรรถประโยชน์ลินุกซ์s3cmd ฉันใช้แบบนี้ใน Python:

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

1
ไม่ใช่ pythonic อย่างแน่นอนที่จะเรียกใช้ subshell เพื่อสื่อสารกับ S3 (ไลบรารีหรือธุรกรรม 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. แสดงรายการไฟล์ทั้งหมดในที่เก็บข้อมูล- ท่อ ->
  2. รับพารามิเตอร์ที่ 4 (เป็นชื่อไฟล์) --pipe -> // คุณสามารถแทนที่ด้วยคำสั่ง linux เพื่อให้ตรงกับรูปแบบของคุณ
  3. เรียกใช้สคริปต์การลบด้วย aws cli

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

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()
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.