Разбор файла JSON из сегмента S3
Я относительно новичок в Amazon Web Services.
Мне нужна помощь по синтаксическому анализу файла JSON из S3 Bucket с помощью Python. Мне удалось прочитать файл JSON из S3 с помощью триггера S3, подключенного к лямбда-функции, и также отобразить его в Cloud-Watch. Мне нужна помощь в том, как разобрать "результаты" из файла JSON и вычислить максимальное, минимальное и среднее значение "Результатов".
Вот мой файл JSON:
Student = [{"Student_ID": 1,
"Name":"Erik",
"ExamSubject": "English",
"Result": 72.3,
"ExamDate": "9/12/2020",
"Sex": "M"},
{"Student_ID": 2,
"Name":"Daniel",
"ExamSubject": "English",
"Result": 71,
"ExamDate": "9/12/2020",
"Sex": "M"},
{"Student_ID": 3,
"Name":"Michael",
"ExamSubject": "English",
"Result": 62,
"ExamDate": "9/12/2020",
"Sex": "M"},
{"Student_ID": 4,
"Name":"Sven",
"ExamSubject": "English",
"Result": 73,
"ExamDate": "9/12/2020",
"Sex": "M"},
{"Student_ID": 5,
"Name":"Jake",
"ExamSubject": "English",
"Result": 84.15,
"ExamDate": "9/12/2020",
"Sex": "M"},
]
print(Student)
и вот код, который я использовал для лямбда-функции:
import json
import boto3
s3 = boto3.client('s3')
def lambda_handler(event, context):
bucket = 'finalyearpro-aws'
key = 'StudentResults.json'
try:
data = s3.get_object(Bucket=bucket, Key=key)
json_data = data['Body'].read().decode('utf-8')
print (json_data)
except Exception as e:
raise e
Как мне добавить к этому коду, чтобы он читал "Результаты" из файла JSON, анализировал его (макс., Мин., Среднее) и отображал на консоли Lambda.
3 ответа
Вы можете загрузить документ, используя boto3.resource('s3').Object(...).get()
а затем проанализируйте его на Python с помощью json.loads()
:
import json
import boto3
s3 = boto3.resource('s3')
def lambda_handler(event, context):
bucket = 'finalyearpro-aws'
key = 'StudentResults.json'
obj = s3.Object(bucket, key)
data = obj.get()['Body'].read().decode('utf-8')
json_data = json.loads(data)
print(json_data)
boto3 перешел на новый формат ресурса (см. https://github.com/boto/boto3/issues/56). Если вы получаете сообщение об ошибке
'S3' object has no attribute 'Object'
, попробуйте следующее:
import boto3
import json
s3 = boto3.resource('s3')
obj = s3.Bucket('bucket-name').Object('object-key')
jsonStr = obj.get()['Body'].read().decode('utf-8')
jsonObj = json.loads(jsonStr)
json.loads(json_data)
проанализирует строку json и создаст из нее список dicts (для этих данных). После этого вы можете перебирать список и делать все, что хотите, т.е.
data = json.loads(json_data)
min([r['Result'] for r in data])