问题:使用Boto3将S3对象作为字符串打开
我知道,使用Boto 2,可以使用以下命令将S3对象作为字符串打开: get_contents_as_string()
boto3中有等效功能吗?
回答 0
read
将返回字节。至少对于Python 3,如果要返回字符串,则必须使用正确的编码进行解码:
import boto3
s3 = boto3.resource('s3')
obj = s3.Object(bucket, key)
obj.get()['Body'].read().decode('utf-8')
回答 1
由于.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'))
回答 2
boto3文档中没有此内容。这为我工作:
object.get()["Body"].read()
对象是s3对象:http : //boto3.readthedocs.org/en/latest/reference/services/s3.html#object
回答 3
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
回答 4
如果body包含io.StringIO,则必须执行以下操作:
object.get()['Body'].getvalue()