ฉันทราบว่าด้วย Boto 2 เป็นไปได้ที่จะเปิดวัตถุ S3 เป็นสตริงด้วย: get_contents_as_string()
มีฟังก์ชั่นที่เทียบเท่าใน boto3 หรือไม่?
ฉันทราบว่าด้วย Boto 2 เป็นไปได้ที่จะเปิดวัตถุ S3 เป็นสตริงด้วย: get_contents_as_string()
มีฟังก์ชั่นที่เทียบเท่าใน boto3 หรือไม่?
คำตอบ:
read
จะกลับไบต์ อย่างน้อยสำหรับ Python 3 หากคุณต้องการส่งคืนสตริงคุณต้องถอดรหัสโดยใช้การเข้ารหัสที่ถูกต้อง:
import boto3
s3 = boto3.resource('s3')
obj = s3.Object(bucket, key)
obj.get()['Body'].read().decode('utf-8')
import botocore
ตามobj.get()['Body']
แบบ<class 'botocore.response.StreamingBody'>
ฉันมีปัญหาในการอ่าน / แยกวิเคราะห์วัตถุจาก S3 เนื่องจาก.get()
ใช้ Python 2.7 ใน AWS Lambda
ฉันเพิ่ม json ในตัวอย่างเพื่อแสดงว่าแยกวิเคราะห์ได้ :)
import boto3
import json
s3 = boto3.client('s3')
obj = s3.get_object(Bucket=bucket, Key=key)
j = json.loads(obj['Body'].read())
หมายเหตุ (สำหรับ python 2.7): วัตถุของฉันคือ ascii ทั้งหมดดังนั้นฉันไม่ต้องการ .decode('utf-8')
หมายเหตุ (สำหรับ python 3.6+): เราย้ายไปที่ python 3.6 และค้นพบว่าread()
ตอนนี้จะกลับมาbytes
ดังนั้นถ้าคุณต้องการที่จะได้รับสตริงจากมันคุณต้องใช้:
j = json.loads(obj['Body'].read().decode('utf-8'))
นี่ไม่ได้อยู่ในเอกสาร boto3 สิ่งนี้ใช้ได้กับฉัน:
object.get()["Body"].read()
วัตถุที่เป็นวัตถุ s3: http://boto3.readthedocs.org/en/latest/reference/services/s3.html#object
get expected at least 1 arguments, got 0
ดูเหมือนว่าตอนนี้ ลบget()
และเข้าถึงคุณสมบัติวัตถุ "ร่างกาย" โดยตรง
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
หากเนื้อหามี io.StringIO คุณต้องทำดังนี้
object.get()['Body'].getvalue()