Boto3でS3オブジェクトを文字列として開く


回答:


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 David Wong 2017

1
@TzunghsingDavidWong既存のオブジェクトのメソッドを呼び出すためにパッケージをインポートする必要はありませんよね?実験中にのみ必要だったのでしょうか?
ケンウィリアムズ

1
obj = s3.Object(bucket、key)**バケットのキーの値は何ですか?そして、キーはファイル名
ですか

1
@Amareshはい、バケット=バケット名とキー=ファイル名
Tipster

キーがpdf形式の場合、それは機能しますか?または、別の便利な方法を提案してください。textracttext = textract.process( 'path / to / a.pdf'、method = 'pdfminer')をインポートしようとしました。インポートエラーが発生します
Arun Kumar

96

.get()AWS Lambda内でPython 2.7 を使用しているため、S3からのオブジェクトの読み取り/解析に問題がありました。

例に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ドキュメントは混乱している
Timo

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 2015年

28
boto3 2016のように、恐ろしいドキュメントを取得
Andrew_1510

3
boto3.readthedocs.io/en/latest/reference/services/…は、戻り値がdictであり、タイプStreamingBodyのキー「Body」を持っていることを示します。これを読み取りドキュメントで検索すると、botocore.readthedocs.io /にアクセスできます。 en / latest / reference / response.htmlは、read()の使用を指示します。
ジェフリー2017

3
今のようですget expected at least 1 arguments, got 0。を削除しget()、「Body」オブジェクトプロパティに直接アクセスします
lurscher

13

Python3 + boto3 APIアプローチの使用。

使用してS3.Client.download_fileobjのAPIPythonのファイルのようなオブジェクトを、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

bodyにio.StringIOが含まれている場合は、以下のようにする必要があります。

object.get()['Body'].getvalue()
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.