我一直在S3 bucket 'test'中跟踪JSON
{
'Details' : "Something"
}
我使用下面的代码来读取这个JSON并打印关键字'Details'
s3 = boto3.resource('s3',
aws_access_key_id=<access_key>,
aws_secret_access_key=<secret_key>
)
content_object = s3.Object('test', 'sample_json.txt')
file_content = content_object.get()['Body'].read().decode('utf-8')
json_content = json.loads(repr(file_content))
print(json_content['Details'])
我得到错误**'字符串索引必须是整数'**我不想从S3下载文件,然后阅读..
7条答案
按热度按时间b4qexyjb1#
正如上面的注解中提到的,
repr
必须被删除,json
文件必须使用双引号作为属性。在aws/s3上使用这个文件:下面的Python代码,它可以工作:
dwthyt8l2#
下面这些对我很有效。
进一步改善
让我们将上面的代码片段称为
read_s3.py
。直接对AWS Id和Secret Keys进行硬编码并不是一个好主意。对于最佳实践,您可以考虑以下任一项:
(1)从存储在本地存储中的json文件(
aws_cred.json
)读取您的AWS凭据:(2)从你的环境变量中读取(我的首选部署选项):
让我们准备一个名为
read_s3_using_env.sh
的shell脚本来设置环境变量,并添加我们的python脚本(read_s3.py
),如下所示:现在在终端中执行shell脚本,如下所示:
gwo2fgha3#
想要补充的是,
botocore.response.streamingbody
与json.load
配合良好:nzrxty8p4#
您可以在AWS Lambda中使用以下代码从S3存储桶读取JSON文件,并使用python对其进行处理。
44u64gxh5#
我被卡住了一点,因为解码对我不起作用(s3对象是gzip压缩的)。
找到了这个讨论,帮助我:Python gzip: is there a way to decompress from a string?
如果你打印jsonData,你会看到你想要的JSON文件!如果你在AWS本身运行测试,一定要检查CloudWatch日志,因为在lambda中,如果太长,它不会输出完整的JSON文件。
xlpyo6sf6#
使用cloudpathlib很容易做到这一点,它支持S3以及Google Cloud Storage和Azure Blob Storage。下面是一个示例:
这在设置particular options或different authentication mechanisms或保留persistent cache方面带来了一些额外的好处,因此您不必总是从S3重新下载。
qxgroojn7#
如果你的json文件看起来像这样:
你可以像
dict
这样访问它: