2015-09-05 6 views
9

तरह से मैं उपयोग कर रहा है एक सूची में संग्रह को बदलने और लंबाई क्वेरी करने के लिए है: पूरे संग्रह के इस बलों संकल्पमुझे boto3 संग्रह का आकार कैसे प्राप्त हो सकता है?

s3 = boto3.resource('s3') 
bucket = s3.Bucket('my_bucket') 
size = len(list(bucket.objects.all())) 

हालांकि, और पहली जगह में एक संग्रह के उपयोग के लाभ obviates। क्या ऐसा करने के लिए इससे अच्छा तरीका है?

उत्तर

17

सभी वस्तुओं को सूचीबद्ध किए बिना बाल्टी में चाबियों की गिनती पाने का कोई तरीका नहीं है यह एडब्ल्यूएस एस 3 की एक सीमा है (https://forums.aws.amazon.com/thread.jspa?messageID=164220 देखें)।

size = sum(1 for _ in bucket.objects.all()) 

जो तुम दे देंगे:

वस्तु सारांश (सिर) प्राप्त करता है न कि वास्तविक डेटा तो एक अपेक्षाकृत सस्ती आपरेशन होना चाहिए और फिर तुम कर सकते हो अगर आप सिर्फ सूची को त्यागकर कर रहे हैं हो रही है सूची बनाने के बिना वस्तुओं की संख्या।

0

similar question से उधार लेना, बाल्टी + उपसर्ग से ऑब्जेक्ट कुंजियों की पूरी सूची पुनर्प्राप्त करने का एक विकल्प list_objects_v2 विधि के साथ रिकर्सन का उपयोग करना है।

यह विधि एक समय में ऑब्जेक्ट कुंजी, 1000 कुंजी की सूची को पुनः प्राप्त कर देगी।

list_objects_v2 पर प्रत्येक अनुरोध पिछले अनुरोध से अंतिम कुंजी के बाद लिस्टिंग कुंजी जारी रखने के लिए StartAfter तर्क का उपयोग करता है।

import boto3 

if __name__ == '__main__': 

    client = boto3.client('s3', 
     aws_access_key_id  = 'access_key', 
     aws_secret_access_key = 'secret_key' 
    ) 

    def get_all_object_keys(bucket, prefix, start_after = '', keys = []): 
     response = client.list_objects_v2(
      Bucket  = bucket, 
      Prefix  = prefix, 
      StartAfter = start_after 
     ) 

     if 'Contents' not in response: 
      return keys 

     key_list = response['Contents'] 
     last_key = key_list[-1]['Key'] 

     keys.extend(key_list) 

     return get_all_object_keys(bucket, prefix, last_key, keys) 

    object_keys = get_all_object_keys('your_bucket', 'prefix/to/files') 

    print(len(object_keys)) 
संबंधित मुद्दे