使用Boto3将S3对象作为字符串打开


Answers:


228

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

import boto3

s3 = boto3.resource('s3')

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

1
得到这个答案的工作,我不得不import botocoreobj.get()['Body']的类型为<class 'botocore.response.StreamingBody'>
Tzunghsing王守业

1
@TzunghsingDavidWong您不必导入软件包即可在现有对象上调用方法,对吗?那也许只是在实验时才有必要吗?
肯·威廉姆斯

1
obj = s3.Object(bucket,key)** bucket中的key的值是buckername?关键是文件名??? ***如果我输入错误,请纠正我...
Amaresh Jana

1
@Amaresh是的,存储桶=存储桶名称和密钥=文件名
Tipster

如果密钥是pdf格式,可以使用吗?或请提出另一种有用的方法,我尝试导入textract text = 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
假设“正文”包含字符串数据,则可以使用object.get()[“正文”] .read()转换为Python字符串。
roehrijn

28
截至2016
。– Andrew_1510 '16

3
boto3.readthedocs.io/en/latest/reference/services/…告诉我们返回值是一个dict,带有类型为StreamingBody的键“ Body”,在阅读文档时进行搜索即可将您转到botocore.readthedocs.io/ zh / latest / reference / response.html,它将告诉您使用read()。
jeffrey

3
现在看来get expected at least 1 arguments, got 0。删除get()并直接访问“
正文

13

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

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

object.get()['Body'].getvalue()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.