我知道与Boto 2,它可以打开一个S3对象作为字符串:get_contents_as_string()
boto3中是否有等效的函数?
我知道与Boto 2,它可以打开一个S3对象作为字符串:get_contents_as_string()
boto3中是否有等效的函数?
当前回答
这不在boto3文档中。这招对我很管用:
object.get()["Body"].read()
对象是s3对象:http://boto3.readthedocs.org/en/latest/reference/services/s3.html#object
其他回答
这不在boto3文档中。这招对我很管用:
object.get()["Body"].read()
对象是s3对象:http://boto3.readthedocs.org/en/latest/reference/services/s3.html#object
Read将返回字节。至少对于Python 3,如果你想返回一个字符串,你必须使用正确的编码来解码:
import boto3
s3 = boto3.resource('s3')
obj = s3.Object(bucket, key)
obj.get()['Body'].read().decode('utf-8')
如果正文包含io。StringIO,你必须像下面这样做:
object.get()['Body'].getvalue()
将整个对象体解码为一个字符串:
obj = s3.Object(bucket, key).get()
big_str = obj['Body'].read().decode()
逐行解码对象主体为字符串:
obj = s3.Object(bucket, key).get()
reader = csv.reader(line.decode() for line in obj['Body'].iter_lines())
自Python 3以来,bytes' decode()中的默认编码已经是'utf-8'。
解码为JSON时,不需要转换为字符串,作为JSON。load也接受字节,从Python 3.6开始:
obj = s3.Object(bucket, key).get()
json.loads(obj['Body'].read())
我在从S3读取/解析对象时遇到了一个问题,因为.get()在AWS Lambda中使用Python 2.7。
我将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):我们移动到python 3,发现read()现在返回字节,所以如果你想从中获得一个字符串,你必须使用:
j = json.loads(obj['Body'].read().decode('utf-8'))