web-dev-qa-db-ja.com

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

Boto 2では、S3オブジェクトを文字列として開くことが可能です。

get_contents_as_string() http://boto.readthedocs.org/en/latest/ref/file.html?highlight=contents%20string#boto.file.key.Key.get_contents_as_string

Boto3に同等の機能はありますか?

107
Gahl Levy

readはバイトを返します。少なくともPython 3では、文字列を返したい場合は、正しいエンコーディングを使ってデコードする必要があります。

import boto3

s3 = boto3.resource('s3')

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

これはboto3のドキュメントにはありません。これは私のために働いた:

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

オブジェクトがs3オブジェクトであること: http://boto3.readthedocs.org/en/latest/reference/services/s3.html#object

66
Gahl Levy

AWS Lambda内でPython 2.7を使用している.get()のため、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'))

61
EvgenyKolyakov

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

S3.Client.download_fileobj APIおよび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
Gatsby Lee