làm thế nào để xóa các tập tin khỏi thùng amazon s3?


91

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?


Bạn đang sử dụng thư viện Python nào (nếu có) để hỗ trợ S3? Hay bạn sẽ chuyển trực tiếp đến các giao diện REST hoặc SOAP trong mã Python của mình?
TJ Crowder

1
tôi đang sử dụng thư viện python boto.s3
Suhail

Câu trả lời:


94

Đ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()

1
Nếu đối tượng không có mặt thì nó sẽ báo lỗi?
Akash Tantri

2
@AkashTantri Cá nhân tôi chưa thử, nhưng tài liệu cho biết nó loại bỏ phiên bản null (nếu có) [...] Nếu không có phiên bản rỗng, Amazon S3 sẽ không xóa bất kỳ đối tượng nào. Vì vậy, dự đoán của tôi là nó sẽ không gây ra lỗi. Nếu bạn tình cờ thử nó (chỉ cần làm một cái gì đó giống như 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().
Kohányi Róbert

Hoạt động như một sự quyến rũ, đó là sức mạnh thực sự của trăn
yunus 21/02 '19

@yunus có phải đây là một nhận xét nghiêm túc?
Henry Henrinson

Liệu các your-keyđây có nghĩa là tên tập tin thực tế trong your-buckettrên S3?
Underoos

91

đã 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)

10
Nếu bạn muốn xóa tất cả mọi thứ trong một cái xô, bạn có thể làm:for x in b.list(): b.delete_key(x.key)
jontsai

19
Tôi yêu như thế nào trong tập tin của tôi nó hóa ra làbucket.list()
Artur Sapek

Để đoạn mã này hoạt động như đã trình bày, bạn cũng cần phải nhập Bucketvà nhập Key. Như trong:from boto.s3.connection import S3Connection, Bucket, Key
Nick Chammas,

Tôi nhận được, >>> 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.connectionvui lòng cập nhật câu trả lời cho boto3
Harry Moreno

1
figured it out và viết lên một giải pháp harrymoreno.com/2017/04/24/...
Harry Moreno

74

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

6
@Rob Tài liệu boto3 gây hiểu lầm. nó sẽ tạo một điểm đánh dấu xóa nếu đối tượng được tạo phiên bản. Nếu không, nó sẽ xóa đối tượng.
jarmod

1
Sạch sẽ và đơn giản. Có thể là câu trả lời được chấp nhận và chắc chắn nên được hợp nhất với câu trả lời của @ Kohányi Róbert vì cả hai đều là cách tiếp cận tốt nhất cho nhiệm vụ.
PaulB

15

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.


4

Tôi ngạc nhiên là không có cách này dễ dàng 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

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
            }
        ]
    }
)


3

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().


vâng, tôi đang sử dụng thư viện python đó, nhưng liệu điều đó có xóa, tệp không? Tôi có nên làm theo cách này không: k.key = 'images / anon-images / small /' + filename k.delete_key (), điều này có đúng không? làm ơn cho tôi biết.
Suhail

@Suhail: Tôi chưa sử dụng thư viện đó, nhưng từ nguồn mà tôi đã liên kết, những gì nó thực sự đang làm là một DELETEcuộ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.
TJ Crowder

1
Còn việc xóa nhiều tệp có tiền tố chung trong tên thì sao? S3 có cho phép một số thao tác xóa hàng loạt đối với trường hợp như vậy không, hay xóa từng cái một (chậm)?
Illarion Kovalchuk

@Shaman: Tôi không phải là chuyên gia về S3, nhưng theo tôi biết , bạn chỉ có thể xóa một tệp cụ thể. Nhưng bạn có thể thực sự muốn hỏi điều đó như một câu hỏi để nó nhận được sự chú ý từ các chuyên gia S3.
TJ Crowder

Ngay sau khi bình luận ở đây, tôi đã thêm một câu hỏi như vậy. Nó có 2 lượt xem nào :)
Illarion Kovalchuk

2

Cách đơn giản nhất để làm điều này là:

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

1

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)

1
Việc gọi một vỏ con để giao tiếp với S3 không hẳn là khó hiểu (thư viện hoặc giao dịch HTTP trực tiếp sẽ thanh lịch hơn), nhưng nó vẫn hoạt động. Tôi không nghĩ rằng nó xứng đáng nhận được sự ủng hộ. +1.
Randall Cook

1

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)   

1

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:

  1. liệt kê tất cả các tệp trên thùng --pipe ->
  2. lấy tham số thứ 4 (tên tệp của nó) --pipe -> // bạn có thể thay thế nó bằng lệnh linux để phù hợp với mẫu của bạn
  3. chạy xóa tập lệnh với aws cli

1

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

0

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 deletephươ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)

0

Dưới đây là đoạn mã bạn có thể sử dụng để xóa nhóm,

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

0

vui lòng thử mã này

import boto3   
s3 = boto3.client('s3')
s3.delete_object(Bucket="s3bucketname", Key="s3filepath")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.