Buka objek S3 sebagai string dengan Boto3

Jawaban:

228

readakan 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') 
Kamil Sindi
sumber
1
untuk mendapatkan jawaban ini bekerja, saya harus import botocoresebagai obj.get()['Body']adalah tipe<class 'botocore.response.StreamingBody'>
Tzunghsing David Wong
1
@TzunghsingDavidWong Anda tidak perlu mengimpor paket untuk memanggil metode pada objek yang ada, bukan? Apakah itu mungkin hanya perlu saat bereksperimen?
Ken Williams
1
berapakah nilai kunci pada obj = s3.Object (bucket, key) ** bucket adalah buckername ?? dan kuncinya adalah nama file ??? *** tolong perbaiki saya jika saya salah ...
Amaresh Jana
1
@Amaresh ya, bucket = nama ember dan kunci = nama file
Tipster
jika kunci adalah format pdf, apakah itu berfungsi? atau tolong sarankan cara lain yang bermanfaat, saya mencoba mengimpor textract text = textract.process ('path / to / a.pdf', method = 'pdfminer') Ini akan menabur kesalahan impor
Arun Kumar
96

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 bytesjadi jika Anda ingin mendapatkan string dari itu, Anda harus menggunakan:

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

EvgenyKolyakov
sumber
18
Bekerja untukku! Dokumentasi AWS Boto3 berantakan
Timo
76

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

Gahl Levy
sumber
1
dengan asumsi "Tubuh" berisi data string, Anda dapat menggunakan object.get () ["Tubuh"]. read () untuk mengonversi ke string Python.
roehrijn
28
boto3 dapatkan dokumen yang mengerikan, mulai 2016.
Andrew_1510
3
boto3.readthedocs.io/en/latest/reference/services/... memberi tahu kami bahwa nilai baliknya adalah dict, dengan kunci "Badan" dari tipe StreamingBody, mencari itu dalam membaca dokumen membuat Anda ke botocore.readthedocs.io/ id / latest / reference / response.html yang akan memberi tahu Anda untuk menggunakan read ().
jeffrey
3
Sepertinya sekarang get expected at least 1 arguments, got 0. Hapus get()dan akses properti objek "Tubuh" secara langsung
lurscher
13

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
Gatsby Lee
sumber
-5

Jika badan mengandung io.StringIO, Anda harus melakukan seperti di bawah ini:

object.get()['Body'].getvalue()
Pyglouthon
sumber