B3 के साथ स्ट्रिंग के रूप में S3 ऑब्जेक्ट खोलें


149

मुझे पता है कि Boto 2 के साथ एक S3 ऑब्जेक्ट को स्ट्रिंग के रूप में खोलना संभव है: get_contents_as_string()

बोटो 3 में एक समान कार्य है?


8
मेरा मतलब था एक अंतिम जवाब चुनें, अधिमानतः मेरा;)
इवगेनीकोलिकोव

जवाबों:


228

readबाइट वापस करेंगे। कम से कम पायथन 3 के लिए, यदि आप एक स्ट्रिंग वापस करना चाहते हैं, तो आपको सही एन्कोडिंग का उपयोग करके डिकोड करना होगा:

import boto3

s3 = boto3.resource('s3')

obj = s3.Object(bucket, key)
obj.get()['Body'].read().decode('utf-8') 

1
काम करने के लिए इस सवाल का जवाब पाने के लिए, मैं था import botocoreके रूप में obj.get()['Body']इस प्रकार का है<class 'botocore.response.StreamingBody'>
Tzunghsing डेविड वोंग

1
@TzunghsingDavidWong आपको किसी मौजूदा ऑब्जेक्ट पर कॉल करने के तरीकों के लिए पैकेज का आयात नहीं करना चाहिए, है ना? क्या यह प्रयोग करते समय केवल आवश्यक था?
केन विलियम्स

1
obj = s3.Object (बकेट, की) में कुंजी का मान क्या है? और कुंजी फ़ाइल का नाम है ??? *** कृपया मुझे सही अगर im गलत ...
अमरेश

1
@ उमेश हाँ, बाल्टी = बाल्टी नाम और कुंजी = फ़ाइल नाम
टिपस्टर

अगर एक कुंजी पीडीएफ प्रारूप है, यह काम है? या कृपया एक और उपयोगी तरीका सुझाइए, मैंने textract text = textract.process ('path / to / a.pdf', विधि = 'pdfminer') आयात करने की कोशिश की, यह आयात त्रुटि बोएगा
अरुण कुमार

96

मुझे .get()एक एडब्ल्यूएस लैम्ब्डा के अंदर पायथन 2.7 का उपयोग करने के कारण एस 3 से ऑब्जेक्ट को पढ़ने / पार्स करने की समस्या थी ।

मैंने उदाहरण के लिए json को यह दिखाने के लिए जोड़ा कि यह पार्स करने योग्य हो गया :)

import boto3
import json

s3 = boto3.client('s3')

obj = s3.get_object(Bucket=bucket, Key=key)
j = json.loads(obj['Body'].read())

नोट (अजगर 2.7 के लिए): मेरी वस्तु सभी एस्की है, इसलिए मुझे इसकी आवश्यकता नहीं है .decode('utf-8')

ध्यान दें (अजगर 3.6+ के लिए): हम अजगर 3.6 में चले गए और पता चला कि read()अब लौटता bytesहै यदि आप इसे से एक स्ट्रिंग प्राप्त करना चाहते हैं, तो आपको इसका उपयोग करना चाहिए:

j = json.loads(obj['Body'].read().decode('utf-8'))


18
मेरे लिए काम किया! एडब्ल्यूएस Boto3 प्रलेखन एक मेस है
टीमो

76

यह बोटो 3 प्रलेखन में नहीं है। यह मेरे लिए काम किया:

object.get()["Body"].read()

ऑब्जेक्ट s3 ऑब्जेक्ट होना: http://boto3.readthedocs.org/en/latest/reference/services/s3.html#object


1
यह मानते हुए कि "बॉडी" में स्ट्रिंग डेटा है, आप ऑब्जेक्ट का उपयोग कर सकते हैं। () ["बॉडी"] पढ़ सकते हैं () पायथन स्ट्रिंग में कनवर्ट कर सकते हैं।
12:30 बजे रोहिराज

28
boto3 को भयानक डॉक मिलता है, 2016 तक।
एंड्रयू_ 1510

3
boto3.readthedocs.io/en/latest/reference/services/... हमें बताता वापसी मान, एक प्रमुख प्रकार StreamingBody की "द बॉडी" के साथ, डॉक्स पढ़ में है कि के लिए खोज एक dict है करने के लिए आप हो जाता है botocore.readthedocs.io/ en / नवीनतम / संदर्भ / response.html जो आपको रीड () का उपयोग करने के लिए कहेगा।
जेफ्री

3
अब लगता है get expected at least 1 arguments, got 0। निकालें get()और "बॉडी" ऑब्जेक्ट प्रॉपर्टी को सीधे एक्सेस करें
lurscher

13

Python3 + boto3 API दृष्टिकोण का उपयोग करना।

S3.Client.download_fileobj API और Python फ़ाइल जैसी ऑब्जेक्ट का उपयोग करके , S3 ऑब्जेक्ट सामग्री को मेमोरी में पुनः प्राप्त किया जा सकता है।

चूंकि पुनर्प्राप्त की गई सामग्री बाइट्स है, इसलिए str में बदलने के लिए , इसे डिकोड करना होगा।

import io
import boto3

client = boto3.client('s3')
bytes_buffer = io.BytesIO()
client.download_fileobj(Bucket=bucket_name, Key=object_key, Fileobj=bytes_buffer)
byte_value = bytes_buffer.getvalue()
str_value = byte_value.decode() #python3, default decoding is utf-8

-5

यदि शरीर में io.StringIO शामिल है, तो आपको नीचे की तरह करना होगा:

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