使用Python boto3从S3读取JSON文件

时间:2016-12-06 12:18:19

标签: python json amazon-web-services amazon-s3 boto3

我一直在S3桶中测试JSON'测试'

{
  'Details' : "Something" 
}

我正在使用以下代码来阅读此JSON并打印密钥'详细信息'

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'])

我收到错误,因为&#39;字符串索引必须是整数&#39; 我不想从S3下载文件,然后阅读..

5 个答案:

答案 0 :(得分:18)

如上面的评论中所述,必须删除repr,并且json文件必须使用双引号作为属性。在aws / s3上使用此文件:

{
  "Details" : "Something"
}

以及以下Python代码,它可以工作:

import boto3
import json

s3 = boto3.resource('s3')

content_object = s3.Object('test', 'sample_json.txt')
file_content = content_object.get()['Body'].read().decode('utf-8')
json_content = json.loads(file_content)
print(json_content['Details'])
# >> Something

答案 1 :(得分:7)

以下内容对我有用。

# read_s3.py
import boto3
BUCKET = 'MY_S3_BUCKET_NAME'
FILE_TO_READ = 'FOLDER_PATH/my_file.json'
client = boto3.client('s3',
                       aws_access_key_id='MY_AWS_KEY_ID',
                       aws_secret_access_key='MY_AWS_SECRET_ACCESS_KEY'
                     )
result = client.get_object(Bucket=BUCKET, Key=FILE_TO_READ) 
text = result["Body"].read().decode()
print(text['Details']) # Use your desired JSON Key for your value 

为获得最佳实践,直接对AWS Id和秘密密钥进行硬编码不是一个好主意。您可以考虑以下任一情况:

(1)从存储在本地存储中的json文件中读取您的AWS凭证:

import json
credentials = json.load(open('aws_cred.json'))
client = boto3.client('s3',
                       aws_access_key_id=credentials['MY_AWS_KEY_ID'],
                       aws_secret_access_key=credentials['MY_AWS_SECRET_ACCESS_KEY']
                     )

(2)从您的环境变量中读取:

import os
client = boto3.client('s3',
                       aws_access_key_id=os.environ['MY_AWS_KEY_ID'],
                       aws_secret_access_key=os.environ['MY_AWS_SECRET_ACCESS_KEY']
                     )

假设我们有一个用于设置环境变量的shell脚本,如下所示:

# set_env.sh
export MY_AWS_KEY_ID='YOUR_AWS_ACCESS_KEY_ID'
export MY_AWS_SECRET_ACCESS_KEY='YOUR_AWS_SECRET_ACCESS_KEY'
# execute the python file containing your code as stated above that reads from s3
python read_s3.py

要设置环境并一起执行read_s3.py,可以在终端中运行shell脚本,如下所示:

sh set_env.sh

答案 2 :(得分:1)

想补充一下,botocore.response.streamingbodyjson.load的搭配很好:

import json
import boto3

s3 = boto3.resource('s3')

obj = s3.Object(bucket, key)
data = json.load(obj['Body']) 

答案 3 :(得分:1)

您可以在AWS Lambda中使用以下代码从S3存储桶中读取JSON文件,并使用python处理它。

import json
import boto3
import sys
import logging

# logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)

VERSION = 1.0

s3 = boto3.client('s3')

def lambda_handler(event, context):
    bucket = 'my_project_bucket'
    key = 'sample_payload.json'
    
    response = s3.get_object(Bucket = bucket, Key = key)
    content = response['Body']
    jsonObject = json.loads(content.read())
    print(jsonObject)

答案 4 :(得分:0)

我因为解码对我没有用而被卡住了(s3对象被gzip压缩)。

发现这个讨论对我有所帮助: Python gzip: is there a way to decompress from a string?

import boto3
import zlib

key = event["Records"][0]["s3"]["object"]["key"]
bucket_name = event["Records"][0]["s3"]["bucket"]["name"]

s3_object = S3_RESOURCE.Object(bucket_name, key).get()['Body'].read()

jsonData = zlib.decompress(s3_object, 16+zlib.MAX_WBITS)

如果你打印jsonData,你会看到你想要的JSON文件!如果您在AWS中运行测试,请务必检查CloudWatch日志,如同在lambda中一样,如果太长,它将不会输出完整的JSON文件。