Saya sadar bahwa dengan Boto 2 dimungkinkan untuk membuka objek S3 sebagai string dengan: get_contents_as_string()
Apakah ada fungsi yang setara di boto3?
Saya sadar bahwa dengan Boto 2 dimungkinkan untuk membuka objek S3 sebagai string dengan: get_contents_as_string()
Apakah ada fungsi yang setara di boto3?
Jawaban:
read
akan mengembalikan byte. Setidaknya untuk Python 3, jika Anda ingin mengembalikan sebuah string, Anda harus mendekode menggunakan pengodean yang benar:
import boto3
s3 = boto3.resource('s3')
obj = s3.Object(bucket, key)
obj.get()['Body'].read().decode('utf-8')
Saya punya masalah untuk membaca / mengurai objek dari S3 karena .get()
menggunakan Python 2.7 di dalam AWS Lambda.
Saya menambahkan json ke contoh untuk menunjukkan itu bisa diurai :)
import boto3
import json
s3 = boto3.client('s3')
obj = s3.get_object(Bucket=bucket, Key=key)
j = json.loads(obj['Body'].read())
CATATAN (untuk python 2.7): Objek saya semuanya ascii, jadi saya tidak perlu .decode('utf-8')
CATATAN (untuk python 3.6+): Kami pindah ke python 3.6 dan menemukan bahwa read()
sekarang kembali bytes
jadi jika Anda ingin mendapatkan string dari itu, Anda harus menggunakan:
j = json.loads(obj['Body'].read().decode('utf-8'))
Ini tidak ada dalam dokumentasi boto3. Ini bekerja untuk saya:
object.get()["Body"].read()
objek menjadi objek s3: http://boto3.readthedocs.org/en/latest/reference/services/s3.html#object
get expected at least 1 arguments, got 0
. Hapus get()
dan akses properti objek "Tubuh" secara langsung
Python3 + Menggunakan pendekatan boto3 API.
Dengan menggunakan S3.Client.download_fileobj API dan objek seperti file Python , konten Object S3 dapat diambil ke memori.
Karena konten yang diambil adalah byte, untuk mengkonversi ke str , itu perlu diterjemahkan.
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
Jika badan mengandung io.StringIO, Anda harus melakukan seperti di bawah ini:
object.get()['Body'].getvalue()
import botocore
sebagaiobj.get()['Body']
adalah tipe<class 'botocore.response.StreamingBody'>