Я знаю, що за допомогою 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 + Використання підходу API boto3.
За допомогою API S3.Client.download_fileobj та файлоподібного об’єкта Python вміст S3 Object можна отримати в пам'ять.
Оскільки отриманий вміст є байтами, для перетворення в 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