Разбор файла 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])
Другие вопросы по тегам