使用Boto3

时间:2015-08-12 22:10:34

标签: python amazon-s3 boto boto3

我知道使用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中是否有等效功能?

5 个答案:

答案 0 :(得分:151)

read将返回字节。至少对于Python 3,如果要返回字符串,则必须使用正确的编码进行解码:

import boto3

s3 = boto3.resource('s3')

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

答案 1 :(得分:65)

这不在boto3文档中。这对我有用:

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

对象是s3对象:http://boto3.readthedocs.org/en/latest/reference/services/s3.html#object

答案 2 :(得分:59)

由于.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'))

答案 3 :(得分:2)

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 :(得分:-2)

如果body包含io.StringIO,则必须执行以下操作:

object.get()['Body'].getvalue()