Подтвердить что ты не робот

Открытый объект S3 в виде строки с Boto3

Мне известно, что в Boto 2 можно открыть объект S3 в виде строки с помощью: get_contents_as_string()

Есть ли эквивалентная функция в boto3?

4b9b3361

Ответ 1

read вернет байты. По крайней мере, для Python 3, если вы хотите вернуть строку, вы должны декодировать, используя правильную кодировку:

import boto3

s3 = boto3.resource('s3')

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

Ответ 2

У меня была проблема с чтением /.get() объекта из 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'))

Ответ 4

Python3 + Использование подхода boto3 API.

Используя API S3.Client.download_fileobj и файлоподобный объект 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()