Python configparser从S3中读取配置文件而无需下载

3

有没有办法在不下载的情况下从S3读取.ini配置文件?涉及IT技术相关内容。

我尝试过以下方法:

config.ini:

[DEFAULT]
test = test1
test1 = test2

[ME]
me = you
you = he

代码:

import boto3
import io
import configparser

s3_boto = boto3.client('s3')
configuration_file_bucket = "mybucket"
configuration_file_key = "config.ini"
obj = s3_boto.get_object(Bucket=configuration_file_bucket, Key=configuration_file_key)

config = configparser.ConfigParser()
config.read(io.BytesIO(obj['Body'].read()))

它返回空数组 []。

我已经努力确保

obj['Body'].read()

返回二进制文件“config.ini”的内容很好。这个是可以工作的。问题出现在稍后的某个地方。

1个回答

5
< p > ConfigParserread 方法需要一个文件名,但是您却传递了一个文件对象。

相反,您可以使用read_string方法,以便您可以将StreamingBody对象的read方法返回的内容传递给它:

config.read_string(obj['Body'].read().decode())

1
我遇到了一个错误:AttributeError: 'StreamingBody' 对象没有 'readable' 属性。 - Arhiliuc Cristina
你提到必须是二进制流的评论让我查看了文档。最终,可行的方法是使用config.read_file(io.TextIOWrapper(io.BytesIO(obj['Body'].read())))。 - Arhiliuc Cristina
不需要使用类似文件的对象。使用类似文件的对象的目的是避免使用read方法将整个文件加载到内存中。但显然,StreamingBody没有实现所有必要的属性,以使其与TextIOWrapper兼容,在这种情况下,您可以简单地使用read_string方法。我已经相应地更新了我的答案。 - blhsing
1
谢谢。顺便说一下,read()方法的文档说明它可以接受一个bytes对象。昨天我尝试了config.read(obj['Body'].read()),但仍然不起作用。type(obj['Body'].read())返回bytes。你知道为什么它不起作用吗? - Arhiliuc Cristina
1
这是因为文档说明如果它是一个字节对象,则会将其视为文件名,就像它是一个字符串一样。 - blhsing
@blhsing,你能否解释一下obj['Body'].read().decode()这段代码的意思呢?谢谢。 - James Huang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接