अमेज़न s3 बाल्टी से फ़ाइलों को हटाने के लिए कैसे?


91

मुझे अजगर में कोड लिखने की ज़रूरत है जो अमेज़ॅन s3 बाल्टी से आवश्यक फ़ाइल को हटा देगा। मैं अमेज़ॅन s3 बाल्टी से कनेक्ट करने में सक्षम हूं, और फ़ाइलों को बचाने के लिए भी, लेकिन मैं किसी फ़ाइल को कैसे हटा सकता हूं?


जो (यदि कोई हो) पायथन पुस्तकालय आप S3 समर्थन के लिए उपयोग कर रहे हैं? या आप अपने पायथन कोड में REST या SOAP इंटरफेस पर सीधे जा रहे हैं?
टीजे क्राउडर

1
मैं
सुहेल

जवाबों:


94

उपयोग boto3(वर्तमान में संस्करण 1.4.4) का उपयोग S3.Object.delete()

import boto3

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

1
यदि वस्तु मौजूद नहीं है, तो क्या यह एक त्रुटि फेंक देगा?
आकाश तंत्री

2
@AkashTantri मैंने व्यक्तिगत रूप से कोशिश नहीं की है, लेकिन डॉक्टर का कहना है कि यह अशक्त संस्करण को हटा देता है (अगर वहाँ एक है) [...] यदि कोई अशक्त संस्करण नहीं है, तो अमेज़न S3 किसी भी ऑब्जेक्ट को नहीं हटाता है। तो मेरा अनुमान है कि यह एक त्रुटि नहीं है। यदि आप इसे करने की कोशिश करते हैं (बस कुछ ऐसा करें s3.Object('existing-bucket', 'bogus-key').delete()और देखें कि क्या होता है। इसके अलावा प्रयास करें s3.Object('bogus-bucket', 'bogus-key').delete()
कोहनी रूबर्ट

एक आकर्षण की तरह काम करता है, थॉट्स द रियल पावर ऑफ़ पाइथन
यूनुस

@ यूनुस यह एक गंभीर टिप्पणी है?
हेनरी हेनरिंसन

क्या your-keyयहाँ में वास्तविक फ़ाइल नाम का अर्थ your-bucketS3 पर?
अंडररोज

91

इसे बोटो का उपयोग करने का एक और तरीका मिला:

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
यदि आप एक बाल्टी में हर for x in b.list(): b.delete_key(x.key)
चीज

19
मैं प्यार करता हूँ कि कैसे मेरी फ़ाइल में यह पता चला हैbucket.list()
Artur Sapek

इस कोड स्निपेट को प्रस्तुत करने के लिए काम करने के लिए, आपको आयात करना होगा Bucketऔर Key, भी। जैसे: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बोटो 3 का जवाब अपडेट करने के लिए कृपया प्राप्त करें
हैरी मोरेनो

1
यह पता लगाया और एक समाधान लिखा है harrymoreno.com/2017/04/24/…
हैरी मोरेनो

74

पायथन boto3 SDK का उपयोग करना (और मान लेना AWS के लिए सेटअप है), निम्नलिखित एक बाल्टी में एक निर्दिष्ट ऑब्जेक्ट को हटा देगा:

import boto3

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

6
@ रोटो boto3 प्रलेखन भ्रामक है। यदि ऑब्जेक्ट संस्करणित है तो यह एक डिलीट मार्कर बना देगा। यह ऑब्जेक्ट को अन्यथा हटा देगा।
जरमोद

1
साफ और सरल। स्वीकृत उत्तर हो सकता है, और निश्चित रूप से @ Kohány Róbert के उत्तर के साथ विलय किया जाना चाहिए क्योंकि दोनों ही कार्य के लिए सर्वश्रेष्ठ दृष्टिकोण हैं।
पॉल 24

15

2020 में आपका स्वागत है यहाँ पायथन / 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}")

मुझे उत्तर खोजने के लिए बहुत लंबा समय लगा और यह इस तरह सरल था।


4

मुझे आश्चर्य है कि यह आसान तरीका नहीं है 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 समय-समय पर बदल सकता है। मैंने 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

कौन सा इंटरफ़ेस? REST इंटरफ़ेस का उपयोग करते हुए, आप बस एक डिलीट भेजें :

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

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>

यदि आप बोटो जैसे पाइथन लाइब्रेरी का उपयोग कर रहे हैं , तो इसे "डिलीट" फीचर को उजागर करना चाहिए, जैसे delete_key()


हाँ, मैं उस अजगर पुस्तकालय का उपयोग कर रहा हूं, लेकिन क्या वह फ़ाइल को हटा देगा? क्या मुझे इसे इस तरह से करना चाहिए: k.key = 'images / anon-images / small /' + filename k.delete_key () क्या यह सही है? कृपया मुझे बताओ।
सुहेल

@ सुहैल: मैंने उस पुस्तकालय का उपयोग नहीं किया है, लेकिन जिस स्रोत से मैंने लिंक किया है, वह वास्तव में क्या कर रहा है, यह DELETEREST इंटरफ़ेस के माध्यम से एक कॉल है। तो हां, "delete_key" नाम के बावजूद (जो मैं सहमत हूं) स्पष्ट नहीं है, यह वास्तव में कुंजी द्वारा संदर्भित ऑब्जेक्ट को हटा रहा है ।
टीजे क्राउडर

1
नाम में एक आम उपसर्ग के साथ बहुत सारी फाइलें निकालने के बारे में क्या? क्या S3 ऐसे मामले के लिए कुछ थोक हटाने की अनुमति देता है, या उन्हें एक के बाद एक (जो धीमा है) हटाना आवश्यक है?
इलारियन कोवलचुक

@ शमन: मैं S3 विशेषज्ञ नहीं हूं, लेकिन जहां तक ​​मुझे पता है , आप केवल एक विशिष्ट फ़ाइल को हटा सकते हैं। लेकिन आप शायद वास्तव में यह पूछना चाहते हैं कि एक प्रश्न के रूप में इसलिए यह S3 विशेषज्ञों से ध्यान आकर्षित करता है।
टीजे क्राउडर

यहाँ टिप्पणी करने के ठीक बाद मैंने ऐसा एक प्रश्न जोड़ा है। इसके 2 दृश्य अभी तक हैं :)
इलारियन कोवलचुक

2

ऐसा करने का सबसे सरल तरीका है:

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

1

अभी के लिए मैंने लिनक्स उपयोगिता s3cmd का उपयोग करके समस्या का समाधान किया है । मैंने इसे पायथन में इस तरह इस्तेमाल किया:

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

1
एस 3 (एक पुस्तकालय या एक सीधा HTTP लेनदेन अधिक सुरुचिपूर्ण होगा) के साथ संवाद करने के लिए एक उपधारा को आमंत्रित करने के लिए यह बिल्कुल सही नहीं है, लेकिन यह अभी भी काम करता है। मुझे नहीं लगता कि यह एक पतन का पात्र है। +1।
रान्डेल कुक

1

यह मेरे लिए काम कर रहा है यह कोशिश करो।

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/ और कुछ यूनिक्स कमांड का उपयोग करके कर सकते हैं ।

इस ai cli कमांड को काम करना चाहिए:

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

यदि आप उप-फ़ोल्डरों को शामिल करना चाहते हैं, तो आपको ध्वज को जोड़ना चाहिए - संक्षिप्त

या यूनिक्स कमांड के साथ:

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

स्पष्टीकरण:

  1. सभी फाइलों को बाल्टी - पिप -> पर सूचीबद्ध करें
  2. चौथा पैरामीटर प्राप्त करें (इसका फ़ाइल नाम) --pipe -> // आप इसे अपने पैटर्न से मिलान करने के लिए linux कमांड से बदल सकते हैं
  3. aws cli के साथ डिलीट स्क्रिप्ट चलाएं

1

यदि आप अपने स्वयं के स्थानीय होस्ट कंसोल का उपयोग करके फ़ाइल को हटाने की कोशिश कर रहे हैं, तो आप इस अजगर स्क्रिप्ट को यह मानकर चला सकते हैं कि आपने सिस्टम में अपनी एक्सेस आईडी और गुप्त कुंजी पहले ही दे दी है।

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

निम्नलिखित ने मेरे लिए काम किया (उदाहरण के लिए एक Django मॉडल के आधार पर, लेकिन आप deleteअपने दम पर विधि के कोड का उपयोग कर सकते हैं)।

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

नीचे कोड स्निपेट है जिसे आप बाल्टी को हटाने के लिए उपयोग कर सकते हैं,

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.