2012-07-11 13 views
26

मैंने "परीक्षण" नामक एस 3 में एक फ़ोल्डर बनाया है और मैं "test_1.jpg", "test_2.jpg" को "test" में धक्का देता हूं।अमेज़ॅन एस 3 बोटो - फ़ोल्डर को कैसे हटाएं?

अब मैं फ़ोल्डर "परीक्षण" को हटाने के लिए बोटो का उपयोग करना चाहता हूं।

मुझे क्या करना चाहिए?

+0

सिर्फ एक अनुमान/परीक्षण काम -r RM नहीं होता नष्ट करने के लिए दे सकते हैं? – pyCthon

उत्तर

33

एस 3 में फ़ोल्डर्स हैं। इसके बजाए, चाबियाँ एक फ्लैट नेमस्पेस बनाती हैं। हालांकि एडब्ल्यूएस कंसोल सहित कुछ कार्यक्रमों में विशेष रूप से कुछ नामों में स्लेश के साथ एक कुंजी दिखाई देती है (उदाहरण के लिए Amazon S3 boto - how to create a folder? देखें)।

"निर्देशिका" को हटाने के बजाय, आप उपसर्ग और हटाकर फ़ाइलों को सूचीबद्ध (और करना) कर सकते हैं। संक्षेप में:

for key in bucket.list(prefix='your/directory/'): 
    key.delete() 

हालांकि इस पृष्ठ पर अन्य संपन्न उत्तरों में अधिक कुशल दृष्टिकोण हैं।


ध्यान दें कि उपसर्ग सिर्फ डमी स्ट्रिंग खोज का उपयोग करके खोजा गया है। यदि उपसर्ग your/directory था, यानी पिछली स्लैश संलग्न किए बिना, कार्यक्रम भी खुशी से your/directory-that-you-wanted-to-remove-is-definitely-not-t‌​his-one हटा देगा।

अधिक जानकारी के लिए S3 boto list keys sometimes returns directory key.

+0

निर्देशिका को कैसे हटाएं? यदि इस निर्देशिका में सभी फ़ाइलों को हटा दिए जाने पर यह निर्देशिका स्वचालित रूप से हटा दी जाएगी? –

+0

धन्यवाद .. मैंने इसे पूरा कर लिया है ~ –

+0

@ वादेहुआंग - क्या आप फ़ोल्डर को हटाने के बारे में अपना कोड साझा कर सकते हैं? – letsc

16

देख आप (मैं इस पाया तेजी key.delete का उपयोग करने से परिमाण के एक आदेश होने के लिए कुंजी की एक बड़ी संख्या के साथ) कुंजी की सूची के साथ bucket.delete_keys() उपयोग कर सकते हैं।

कुछ इस तरह:

delete_key_list = [] 
for key in bucket.list(prefix='/your/directory/'): 
    delete_key_list.append(key) 
    if len(delete_key_list) > 100: 
     bucket.delete_keys(delete_key_list) 
     delete_key_list = [] 

if len(delete_key_list) > 0: 
    bucket.delete_keys(delete_key_list) 
+0

एन + 1 अनुरोधों से बचने के लिए पैट्रिक का समाधान देखें – deepelement

23

मुझे लगता है कि यह एक समय हो गया है और boto3 इस लक्ष्य को पूरा करने के कई तरीके हैं। इसका मतलब यह है कि आप "फ़ोल्डर" परीक्षण हटाना चाहते हैं और अपनी वस्तुओं यहाँ के सभी एक ही रास्ता है:

s3 = boto3.resource('s3') 
objects_to_delete = s3.meta.client.list_objects(Bucket="MyBucket", Prefix="myfolder/test/") 

delete_keys = {'Objects' : []} 
delete_keys['Objects'] = [{'Key' : k} for k in [obj['Key'] for obj in objects_to_delete.get('Contents', [])]] 

s3.meta.client.delete_objects(Bucket="MyBucket", Delete=delete_keys) 

इस फ़ोल्डर में वस्तुओं को लाने के लिए दो अनुरोध एक बनाना चाहिए, दूसरा सब को नष्ट करने के कहा फ़ोल्डर में वस्तुओं।

https://boto3.readthedocs.org/en/latest/reference/services/s3.html#S3.Client.delete_objects

+0

यह अब तक का सबसे तेज़ समाधान है। – deepelement

+0

यह सबसे तेज़ समाधान है, लेकिन ध्यान रखें कि 'list_objects' 1000 से अधिक कुंजी नहीं लौटा सकता है, इसलिए आपको यह कोड कई बार चलाने की आवश्यकता है। – lampslave

+1

यदि आपके पास 1k से अधिक ऑब्जेक्ट हैं तो आप पेजिनेटर का उपयोग कर सकते हैं - नीचे मेरा उत्तर देखें। – dmitrybelyakov

6

पैट्रिक समाधान पर एक मामूली सुधार। जैसा कि आप जानते हैं, list_objects() और delete_objects() दोनों की ऑब्जेक्ट सीमा 1000 है। यही कारण है कि आपको लिस्टिंग में पेजिंग और डिलीट करना होगा। यह सुंदर सार्वभौमिक है और आप Prefixpaginator.paginate() को उपनिर्देशिका/रास्तों

client = boto3.client('s3', **credentials) 
paginator = client.get_paginator('list_objects_v2') 
pages = paginator.paginate(Bucket=self.bucket_name) 

delete_us = dict(Objects=[]) 
for item in pages.search('Contents'): 
    delete_us['Objects'].append(dict(Key=item['Key'])) 

    # flush once aws limit reached 
    if len(delete_us['Objects']) >= 1000: 
     client.delete_objects(Bucket=bucket, Delete=delete_us) 
     delete_us = dict(Objects=[]) 

# flush rest 
if len(delete_us['Objects']): 
    client.delete_objects(Bucket=bucket, Delete=delete_us)