【问题标题】:Parsing a JSON file from a S3 Bucket从 S3 存储桶解析 JSON 文件
【发布时间】:2022-02-17 23:55:49
【问题描述】:

我对 Amazon Web Services 比较陌生。

我需要有关使用 Python 从 S3 存储桶解析 JSON 文件的帮助。我能够使用连接到 lambda 函数的 S3 触发器从 S3 读取 JSON 文件,并将其显示在 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)

这是迄今为止我在 lambda 函数上使用的代码:

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 控制台上。

【问题讨论】:

    标签: python json amazon-web-services amazon-s3 aws-lambda


    【解决方案1】:

    您可以使用boto3.resource('s3').Object(...).get() 加载文档,然后使用json.loads() 将其解析为python:

    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)
    

    【讨论】:

      【解决方案2】:

      json.loads(json_data) 将解析 json 字符串并从中创建 dicts 列表(用于此数据)。之后,您可以遍历列表并做任何您想做的事情,即

      data = json.loads(json_data)
      min([r['Result'] for r in data])
      

      【讨论】:

      • 当我将它放入 lambda 控制台时出现此错误:响应:{“errorMessage”:“模块'lambda_function'中的语法错误:unindent 与任何外部缩进级别不匹配(lambda_function.py,第 18 行)"、"errorType": "Runtime.UserCodeSyntaxError"、"stackTrace": [" File \"/var/task/lambda_function.py\" 第 18 行\n data = json.loads(json_data)\n" ] }
      • @NimraSajid 缩进问题 - 你知道,常规的 python 东西 - 检查这一行的空格是否正确 - 应该像上面的行一样缩进
      • 是的,我是 python 新手,所以我只是在进行过程中弄清楚。 Python 对缩进非常严格。
      【解决方案3】:

      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)
      

      【讨论】:

        猜你喜欢
        • 2022-08-04
        • 1970-01-01
        • 2017-11-23
        • 1970-01-01
        • 2018-07-25
        • 2018-07-08
        • 2020-06-15
        • 2018-08-04
        相关资源
        最近更新 更多