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?
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)
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
@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:
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 :)
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.
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));
Jawaban:
Menggunakan
boto3
(saat ini versi 1.4.4) menggunakanS3.Object.delete()
.import boto3 s3 = boto3.resource('s3') s3.Object('your-bucket', 'your-key').delete()
sumber
s3.Object('existing-bucket', 'bogus-key').delete()
dan lihat apa yang terjadi. Coba jugas3.Object('bogus-bucket', 'bogus-key').delete()
.your-key
sini berarti nama file sebenarnya diyour-bucket
S3?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)
sumber
for x in b.list(): b.delete_key(x.key)
bucket.list()
Bucket
danKey
juga. Seperti dalam: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
tolong perbarui jawaban untuk boto3Menggunakan 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')
sumber
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.
sumber
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()
sumber
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 } ] } )
sumber
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()
.sumber
DELETE
panggilan melalui antarmuka REST. Jadi ya, meskipun namanya "delete_key" (yang saya setujui tidak jelas), itu benar-benar menghapus objek yang direferensikan oleh kunci tersebut.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)
sumber
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)
sumber
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)
sumber
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:
sumber
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));
sumber
Yang berikut ini bekerja untuk saya (berdasarkan contoh untuk model Django, tetapi Anda dapat menggunakan cukup banyak kode
delete
metode 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)
sumber
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()
sumber
silakan coba kode ini
import boto3 s3 = boto3.client('s3') s3.delete_object(Bucket="s3bucketname", Key="s3filepath")
sumber