python - बी 33 से एस 3 बाल्टी में सबफ़ोल्डर नाम पुनः प्राप्त करना




amazon-web-services amazon-s3 (5)

कोड के टुकड़े के नीचे केवल एस 3 बाल्टी से 'फ़ोल्डर' में 'सबफ़ोल्डर'।

import boto3
bucket = 'my-bucket'
#Make sure you provide / in the end
prefix = 'prefix-name-with-slash/'  

client = boto3.client('s3')
result = client.list_objects(Bucket=bucket, Prefix=prefix, Delimiter='/')
for o in result.get('CommonPrefixes'):
    print 'sub folder : ', o.get('Prefix')

अधिक विवरण के लिए, आप https://github.com/boto/boto3/issues/134 को संदर्भित कर सकते हैं

Boto3 का उपयोग कर, मैं अपने एडब्ल्यूएस एस 3 बाल्टी का उपयोग कर सकता हूं:

s3 = boto3.resource('s3')
bucket = s3.Bucket('my-bucket-name')

अब, बाल्टी में फ़ोल्डर first-level , जिसमें कई उप-फ़ोल्डरों को टाइमस्टैम्प के नाम से रखा जाता है, उदाहरण के लिए 1456753904534 मुझे एक और नौकरी के लिए इन उप-फ़ोल्डरों का नाम जानने की आवश्यकता है और मुझे आश्चर्य है कि क्या मुझे उनके लिए बिटो 3 पुनः प्राप्त कर सकते हैं।

इसलिए मैंने कोशिश की:

objs = bucket.meta.client.list_objects(Bucket='my-bucket-name')

जो एक डिक्शनरी देता है, जिसका कुंजी 'सामग्री' मुझे दूसरी स्तरीय टाइमस्टैम्प निर्देशिकाओं के बजाय सभी तीसरी स्तरीय फाइल देती है, वास्तव में मुझे एक सूची मिलती है जिसमें चीजें होती हैं

{यूटैग ':' 'एटैग' ', यू'के': प्रथम-स्तर / 1456753904534 / भाग- 00014, यू'लास्ट मॉडिफाइड ': datetime.datetime (2016, 2, 29, 13, 52, 24, tzinfo = tzutc ()),
u'Owner ': {u' DisplayName ':' स्वामी ', यू' आईडी ':' आईडी '},
यू 'आकार': आकार, u'StorageClass ':' भंडारण वर्ग '}

आप देख सकते हैं कि विशिष्ट फाइलें, इस मामले में part-00014 पुनर्प्राप्त की जाती हैं, जबकि मैं अकेले निर्देशिका का नाम प्राप्त करना चाहता हूं। सिद्धांत रूप में मैं सभी पथों से निर्देशिका का नाम बाहर कर सकता हूं, लेकिन दूसरे स्तर पर जाने के लिए तीसरे स्तर पर सब कुछ हासिल करने के लिए यह बदसूरत और महंगी है!

मैंने यहां कुछ रिपोर्ट की कोशिश की:

for o in bucket.objects.filter(Delimiter='/'):
    print(o.key)

लेकिन मुझे वांछित स्तर पर फ़ोल्डर्स नहीं मिल रहा है

क्या इसका समाधान करने का कोई तरीका है?


एस 3 एक ऑब्जेक्ट स्टोरेज है, इसकी वास्तविक निर्देशिका संरचना नहीं है। "/" बल्कि कॉस्मेटिक है एक कारण है कि लोग एक निर्देशिका संरचना चाहते हैं, क्योंकि वे आवेदन को एक पेड़ को बनाए रखने / छंटनी / जोड़ सकते हैं। एस 3 के लिए, आप इस प्रकार की संरचना को इंडेक्स या खोज टैग की तरह देखते हैं।

एस 3 में ऑब्जेक्ट को हेरप्यूट करने के लिए, आपको boto3.client या boto3.resource की आवश्यकता होती है, उदाहरण के लिए सभी वस्तु की सूची

import boto3 
s3 = boto3.client("s3")
all_objects = s3.list_objects(Bucket = 'my-bucket-name') 

http://boto3.readthedocs.org/en/latest/reference/services/s3.html#S3.Client.list_objects

Boto3: boto3.resource के बारे में एक चेतावनी एक अच्छा उच्च स्तरीय एपीआई है। Boto3.client बनाम boto3.resource का उपयोग करने वाले पेशेवर और विपक्ष हैं यदि आप आंतरिक साझा लाइब्रेरी विकसित करते हैं, तो boto3.resource का उपयोग करके आपको संसाधनों पर एक ब्लैकबॉक्स परत मिलेगा।



यह पता लगाने में मुझे बहुत समय लगा, लेकिन आखिरकार यह बोफो 3 का इस्तेमाल करते हुए एस 3 बाल्टी में एक सबफ़ोल्डर की सूची सूची का एक आसान तरीका है। आशा करता हूँ की ये काम करेगा

prefix = "folderone/foldertwo/"
s3 = boto3.resource('s3')
bucket = s3.Bucket(name="bucket_name_here")
FilesNotFound = True
for obj in bucket.objects.filter(Prefix=prefix):
     print('{0}:{1}'.format(bucket.name, obj.key))
     FilesNotFound = False
if FilesNotFound:
     print("ALERT", "No file in {0}/{1}".format(bucket, prefix))

मेरे लिए निम्न कार्य ... S3 ऑब्जेक्ट्स:

s3://bucket/
    form1/
       section11/
          file111
          file112
       section12/
          file121
    form2/
       section21/
          file211
          file112
       section22/
          file221
          file222
          ...
      ...
   ...

का उपयोग करते हुए:

from boto3.session import Session
s3client = session.client('s3')
resp = s3client.list_objects(Bucket=bucket, Prefix='', Delimiter="/")
forms = [x['Prefix'] for x in resp['CommonPrefixes']] 

हमें मिला:

form1/
form2/
...

साथ में:

resp = s3client.list_objects(Bucket=bucket, Prefix='form1/', Delimiter="/")
sections = [x['Prefix'] for x in resp['CommonPrefixes']] 

हमें मिला:

form1/section11/
form1/section12/




boto3