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?
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?
Yanıtlar:
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()
s3.Object('existing-bucket', 'bogus-key').delete()
ve ne olacağını görün. Ayrıca deneyin s3.Object('bogus-bucket', 'bogus-key').delete()
.
your-key
Burada, S3'teki gerçek dosya adı anlamına mı geliyor your-bucket
?
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)
for x in b.list(): b.delete_key(x.key)
bucket.list()
Bucket
ve ayrıca içe aktarmanız gerekir Key
. Olduğu gibi: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
boto3 cevabını güncelleyin
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')
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
}
]
}
)
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()
.
DELETE
REST 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 .
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)
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:
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));
Aşağıdakiler benim için çalıştı (bir Django modeli örneğine göre, ancak delete
yö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)
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()
lütfen bu kodu deneyin
import boto3
s3 = boto3.client('s3')
s3.delete_object(Bucket="s3bucketname", Key="s3filepath")