Відкрийте об'єкт 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'>
Цзунсінг Девід Вонг,

1
@TzunghsingDavidWong вам не потрібно було б імпортувати пакет для виклику методів на існуючий об'єкт, правда? Це, можливо, було потрібно лише під час експериментів?
Кен Вільямс

1
яке значення ключа в obj = s3.Object (відро, ключ) ** відро - це ім'я ?? і ключовим є ім'я файлу ??? ***, будь ласка, виправте мене, якщо я помиляюся ...
Amaresh Jana

1
@Amaresh так, відро = ім'я відра і ключ = ім'я файлу
Tipster

якщо ключ - формат PDF, чи він працює? або, будь ласка, підкажіть інший корисний спосіб, я спробував імпортувати texttract text = textract.process ('шлях / до / a.pdf', метод = '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'))


18
Працювали для мене! Документація AWS Boto3 - безлад
Тімо

76

Цього немає в документації boto3. Це працювало для мене:

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

як об'єкт s3: http://boto3.readthedocs.org/en/latest/reference/services/s3.html#object


1
припускаючи, що "Body" містить рядкові дані, ou може використовувати object.get () ["Body"]. read () для перетворення в рядок Python.
roehrijn

28
boto3 отримати жахливий документ, станом на 2016.
Andrew_1510

3
boto3.readthedocs.io/en/latest/reference/services/… повідомляє нам, що повернене значення - це дикта, з клавішею "Тіло" типу StreamingBody, пошук цього в прочитаних документах переходить до botocore.readthedocs.io/ en / latest / reference / response.html, який підкаже вам використовувати read ().
Джефрі

3
здається, що зараз get expected at least 1 arguments, got 0. Видаліть get()та
перейдіть до

13

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.