Открыть объект S3 как строку с помощью Boto3

Ответы:

228

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

import boto3

s3 = boto3.resource('s3')

obj = s3.Object(bucket, key)
obj.get()['Body'].read().decode('utf-8') 
Камил Синди
источник
1
чтобы получить этот ответ на работу, мне нужно было import botocoreкак-то obj.get()['Body']типа<class 'botocore.response.StreamingBody'>
Tzunghsing Дэвид Вонг
1
@TzunghsingDavidWong вам не нужно импортировать пакет для вызова методов существующего объекта, верно? Это было возможно только необходимо, экспериментируя?
Кен Уильямс
1
какое значение ключа в obj = s3.Object (bucket, key) ** bucket - это buckername ?? и ключ это имя файла ??? *** пожалуйста, поправьте меня, если я ошибаюсь ...
Амареш Яна
1
@ Амареш, да, ведро = имя и ключ корзины = имя файла
Tipster
если ключ в формате PDF, это работает? или, пожалуйста, предложите другой полезный способ, я попытался импортировать textract text = textract.process ('path / to / a.pdf', method = 'pdfminer'). Это приведет к ошибке импорта
Арун Кумар,
96

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

EvgenyKolyakov
источник
18
Работал на меня! Документация по AWS Boto3 - беспорядок
Тимо
76

Этого нет в документации по boto3. Это сработало для меня:

object.get()["Body"].read()

объект, являющийся объектом s3: http://boto3.readthedocs.org/en/latest/reference/services/s3.html#object

Гал Леви
источник
1
предполагая, что «Body» содержит строковые данные, вы можете использовать object.get () [«Body»]. read () для преобразования в строку Python.
Roehrijn
28
boto3 получит ужасный документ с 2016 года.
Andrew_1510
3
boto3.readthedocs.io/en/latest/reference/services/… сообщает нам, что возвращаемое значение является dict, с ключом «Body» типа StreamingBody, поиск которого в прочитанном документе приводит вас к botocore.readthedocs.io/ ru / latest / reference / response.html, которая скажет вам использовать read ().
Джеффри
3
кажется, что сейчас get expected at least 1 arguments, got 0. Удалите get()и получите доступ к свойству объекта «Тело» напрямую
lurscher
14

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()
Pyglouthon
источник