amazon s3 kovasından dosyalar nasıl silinir?


91

Python'da gerekli dosyayı bir Amazon s3 paketinden silen kod yazmam gerekiyor. Amazon s3 paketine bağlanabiliyorum ve ayrıca dosya kaydedebiliyorum, ancak bir dosyayı nasıl silebilirim?


S3 desteği için hangi (varsa) Python kitaplığını kullanıyorsunuz? Yoksa Python kodunuzdaki REST veya SOAP arayüzlerine mi gideceksiniz?
TJ Crowder

1
python kitaplığını kullanıyorum boto.s3
Suhail

Yanıtlar:


94

Kullanılıyor boto3(şu anda sürüm 1.4.4) S3.Object.delete().

import boto3

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

1
Nesne mevcut değilse bir hata verir mi?
Akash Tantri

2
@AkashTantri Şahsen denemedim, ancak belge boş sürümü kaldırdığını söylüyor (eğer varsa) [...] Boş bir sürüm yoksa, Amazon S3 herhangi bir nesneyi kaldırmaz. Yani benim tahminim bir hata yapmayacağıdır. Eğer denerseniz (sadece benzer bir şey yapın s3.Object('existing-bucket', 'bogus-key').delete()ve ne olacağını görün. Ayrıca deneyin s3.Object('bogus-bucket', 'bogus-key').delete().
Kohányi Róbert

Tılsım gibi çalışır, Thats the real power of python
yunus

@yunus bu ciddi bir yorum mu?
Henry Henrinson

your-keyBurada, S3'teki gerçek dosya adı anlamına mı geliyor your-bucket?
Underoos

91

boto kullanarak bunu yapmanın bir yolunu daha buldu:

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
Bir kovadaki HER ŞEYİ silmek istiyorsanız, şunları yapabilirsiniz:for x in b.list(): b.delete_key(x.key)
jontsai

19
bucket.list()
Dosyamda

Bu kod parçacığının sunulduğu gibi çalışması için Bucketve ayrıca içe aktarmanız gerekir Key. Olduğu gibi:from boto.s3.connection import S3Connection, Bucket, Key
Nick Chammas

Ben olsun >>> 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.connectionboto3 cevabını güncelleyin
Harry Moreno

1
anladım ve bir çözüm yazdı harrymoreno.com/2017/04/24/…
Harry Moreno

74

Kullanımı Python boto3 SDK (ve kimlik bilgileri AWS kurulum varsayılarak), şu kovada belirli bir nesneyi siler:

import boto3

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

6
@Rob Boto3 belgeleri yanıltıcıdır. nesnenin sürümü değiştirilmişse bir silme işareti oluşturacaktır. Aksi takdirde nesneyi silecektir.
jarmod

1
Temiz ve basit. Kabul edilen cevap olabilir ve her ikisi de görev için en iyi yaklaşımlar olduğundan kesinlikle @ Kohányi Róbert in cevabı ile birleştirilmelidir.
PaulB

15

2020'ye hoş geldiniz Python / Django'da cevap:

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

Cevabı bulmam çok uzun sürdü ve bu kadar basitti.


4

Bunun kolay bir yolu olmamasına şaşırdım 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 zaman zaman değişebileceğinden, güncellenmiş bir yöntem aramaya çalışın . Kullandığım ) (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

Hangi arayüz üzerinden? REST arayüzünü kullanarak, sadece bir silme gönderirsiniz :

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

Via SOAP arayüzü :

<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 gibi bir Python kitaplığı kullanıyorsanız , bu gibi bir "silme" özelliği göstermelidir delete_key().


evet, o python kitaplığını kullanıyorum, ancak bu dosyayı silecek mi? bunu şu şekilde yapmalı mıyım: k.key = 'images / anon-images / small /' + filename k.delete_key () bu doğru mu? Lütfen bana haber ver.
Suhail

@Suhail: Bu kitaplığı kullanmadım, ancak bağladığım kaynaktan, aslında yaptığı şey DELETEREST arayüzü üzerinden bir arama. Yani evet, "delete_key" ismine rağmen (ki bu net değil), gerçekten anahtarın referans verdiği nesneyi siliyor .
TJ Crowder

1
Adında ortak bir öneki olan birçok dosyayı kaldırmaya ne dersiniz? S3, bu tür durumlarda toplu silmeye izin veriyor mu, yoksa bunları tek tek silmek (ki bu yavaş) şart mı?
Illarion Kovalchuk

@Shaman: S3 uzmanı değilim, ancak bildiğim kadarıyla yalnızca belirli bir dosyayı silebilirsiniz. Ama muhtemelen bunu bir soru olarak sormak istersiniz, bu yüzden S3 uzmanlarının dikkatini çeker.
TJ Crowder

Burada yorum yaptıktan hemen sonra böyle bir soru ekledim. Henüz 2 kez görüntülendi :)
Illarion Kovalchuk

2

Bunu yapmanın en basit yolu:

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

1

Şimdilik sorunu Linux yardımcı programı s3cmd kullanarak çözdüm . Bunu Python'da şöyle kullandım:

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

1
S3 ile iletişim kurmak için bir alt kabuğu çağırmak tam anlamıyla pitonik değildir (bir kitaplık veya doğrudan bir HTTP işlemi daha zarif olurdu), ancak yine de çalışıyor. Olumsuz oyu hak ettiğini düşünmüyorum. +1.
Randall Cook

1

Benim için denemek işe yaradı.

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/ ve bazı unix komutlarını kullanarak bunu yapabilirsiniz .

bu aws cli komutları çalışmalıdır:

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

alt klasörleri dahil etmek istiyorsanız --recursive işaretini eklemelisiniz

veya unix komutlarıyla:

aws s3 ls s3://<your_bucket_name>/ | awk '{print $4}' | xargs -I%  <your_os_shell>   -c 'aws s3 rm s3:// <your_bucket_name>  /% $1'

açıklama:

  1. kova üzerindeki tüm dosyaları listele --pipe ->
  2. 4. parametreyi (dosya adı) alın --pipe -> // kalıbınıza uyması için onu linux komutuyla değiştirebilirsiniz
  3. aws cli ile silme betiğini çalıştır

1

Dosyayı kendi yerel ana konsolunuzu kullanarak silmeye çalışıyorsanız, sistemde erişim kimliğinizi ve gizli anahtarınızı zaten atadığınızı varsayarak bu python komut dosyasını çalıştırmayı deneyebilirsiniz.

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

Aşağıdakiler benim için çalıştı (bir Django modeli örneğine göre, ancak deleteyöntemin kodunu kendi başına hemen hemen kullanabilirsiniz ).

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

Paketi silmek için kullanabileceğiniz kod parçacığı aşağıdadır,

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

lütfen bu kodu deneyin

import boto3   
s3 = boto3.client('s3')
s3.delete_object(Bucket="s3bucketname", Key="s3filepath")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.