bagaimana cara menghapus file dari ember amazon s3?


91

Saya perlu menulis kode dengan python yang akan menghapus file yang diperlukan dari ember Amazon s3. Saya dapat terhubung ke bucket Amazon s3, dan juga untuk menyimpan file, tetapi bagaimana cara menghapus file?


Pustaka Python (jika ada) mana yang Anda gunakan untuk dukungan S3? Atau apakah Anda akan langsung ke antarmuka REST atau SOAP dalam kode Python Anda?
TJ Crowder

1
saya menggunakan pustaka python boto.s3
Suhail

Jawaban:


94

Menggunakan boto3(saat ini versi 1.4.4) menggunakan S3.Object.delete().

import boto3

s3 = boto3.resource('s3')
s3.Object('your-bucket', 'your-key').delete()

1
Jika objek tidak ada, apakah itu akan menimbulkan kesalahan?
Akash Tantri

2
@AkashTantri Saya belum pernah mencoba secara pribadi, tetapi dokumen mengatakan itu menghapus versi null (jika ada) [...] Jika tidak ada versi null, Amazon S3 tidak menghapus objek apa pun. Jadi tebakan saya adalah bahwa itu tidak akan membuat kesalahan. Jika Anda kebetulan mencobanya (lakukan saja sesuatu seperti s3.Object('existing-bucket', 'bogus-key').delete()dan lihat apa yang terjadi. Coba juga s3.Object('bogus-bucket', 'bogus-key').delete().
Kohányi Róbert

Bekerja seperti pesona, Itulah kekuatan nyata python
yunus

@yunus apakah ini komentar serius?
Henry Henrinson

Apakah di your-keysini berarti nama file sebenarnya di your-bucketS3?
Underoos

91

menemukan satu cara lagi untuk melakukannya dengan menggunakan 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
Jika Anda ingin menghapus SEMUANYA dalam satu ember, Anda dapat melakukannya:for x in b.list(): b.delete_key(x.key)
jontsai

19
Saya suka bagaimana dalam file saya ternyatabucket.list()
Artur Sapek

Agar cuplikan kode ini berfungsi seperti yang disajikan, Anda harus mengimpor Bucketdan Keyjuga. Seperti dalam:from boto.s3.connection import S3Connection, Bucket, Key
Nick Chammas

Saya mendapatkan >>> 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.connectiontolong perbarui jawaban untuk boto3
Harry Moreno

1
menemukan jawabannya
Harry Moreno

74

Menggunakan Python boto3 SDK (dan mengasumsikan kredensial disiapkan untuk AWS), berikut ini akan menghapus objek yang ditentukan dalam keranjang:

import boto3

client = boto3.client('s3')
client.delete_object(Bucket='mybucketname', Key='myfile.whatever')

6
@Rob Dokumentasi boto3 menyesatkan. itu akan membuat penanda hapus jika objek diversi. Ini akan menghapus objek jika tidak.
jarmod

1
Bersih dan sederhana. Bisa jadi jawaban yang diterima, dan pasti harus digabungkan dengan jawaban @ Kohányi Róbert karena keduanya adalah pendekatan terbaik untuk tugas tersebut.
PaulB

15

Selamat datang di tahun 2020 ini jawabannya dengan 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}")

Butuh waktu lama bagi saya untuk menemukan jawabannya dan sesederhana ini.


4

Saya terkejut tidak ada cara mudah ini 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

Cobalah untuk mencari metode yang diperbarui , karena Boto3 dapat berubah dari waktu ke waktu. Saya menggunakan 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

Melalui antarmuka yang mana? Menggunakan antarmuka REST, Anda cukup mengirim delete :

DELETE /ObjectName HTTP/1.1
Host: BucketName.s3.amazonaws.com
Date: date
Content-Length: length
Authorization: signatureValue

Melalui antarmuka 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>

Jika Anda menggunakan pustaka Python seperti boto , itu harus mengekspos fitur "hapus", seperti delete_key().


ya, saya menggunakan pustaka python itu, tetapi apakah itu akan menghapus, file? haruskah saya melakukannya dengan cara ini: k.key = 'images / anon-images / small /' + filename k.delete_key () apakah ini benar? tolong beritahu saya.
Suhail

@ Suhail: Saya belum pernah menggunakan pustaka itu, tetapi dari sumber yang saya tautkan, yang sebenarnya dilakukannya adalah DELETEpanggilan melalui antarmuka REST. Jadi ya, meskipun namanya "delete_key" (yang saya setujui tidak jelas), itu benar-benar menghapus objek yang direferensikan oleh kunci tersebut.
TJ Crowder

1
Bagaimana dengan menghapus banyak file dengan awalan umum pada nama? Apakah S3 mengizinkan beberapa penghapusan massal untuk kasus seperti itu, atau menghapusnya satu per satu (yang lambat) adalah keharusan?
Illarion Kovalchuk

@ Shaman: Saya bukan ahli S3, tetapi sejauh yang saya tahu , Anda hanya dapat menghapus file tertentu. Tapi Anda mungkin ingin benar-benar menanyakannya sebagai pertanyaan agar mendapat perhatian dari para ahli S3.
TJ Crowder

Tepat setelah berkomentar di sini saya telah menambahkan pertanyaan seperti itu. Ini memiliki 2 tampilan :)
Illarion Kovalchuk

2

Cara termudah untuk melakukannya adalah:

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

1

Untuk saat ini saya telah menyelesaikan masalah dengan menggunakan utilitas Linux s3cmd . Saya menggunakannya seperti ini dengan Python:

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

1
Tidak benar-benar pythonic untuk memanggil subkulit untuk berkomunikasi dengan S3 (perpustakaan atau transaksi HTTP langsung akan lebih elegan), tetapi masih berfungsi. Saya tidak berpikir itu layak mendapat suara negatif. +1.
Randall Cook

1

Ini berhasil bagi saya mencobanya.

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

Anda dapat melakukannya menggunakan aws cli: https://aws.amazon.com/cli/ dan beberapa perintah unix.

perintah cli aws ini harus berfungsi:

aws s3 rm s3://<your_bucket_name> --exclude "*" --include "<your_regex>" 

jika Anda ingin menyertakan sub-folder, Anda harus menambahkan tanda --recursive

atau dengan perintah 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'

penjelasan:

  1. daftar semua file di bucket --pipe ->
  2. dapatkan parameter ke-4 (dengan nama file) --pipe -> // Anda dapat menggantinya dengan perintah linux agar sesuai dengan pola Anda
  3. jalankan delete script dengan aws cli

1

jika Anda mencoba untuk menghapus file menggunakan konsol host lokal Anda sendiri, maka Anda dapat mencoba menjalankan skrip python ini dengan asumsi bahwa Anda telah menetapkan id akses dan kunci rahasia Anda di sistem

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

Yang berikut ini bekerja untuk saya (berdasarkan contoh untuk model Django, tetapi Anda dapat menggunakan cukup banyak kode deletemetode itu sendiri).

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

Di bawah ini adalah cuplikan kode yang dapat Anda gunakan untuk menghapus keranjang,

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

silakan coba kode ini

import boto3   
s3 = boto3.client('s3')
s3.delete_object(Bucket="s3bucketname", Key="s3filepath")
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.