修改AWS Lambda实现CSV转指定JSON并移除临时文件
修改后的AWS Lambda代码实现
import json import csv import io import boto3 s3 = boto3.client('s3') def lambda_handler(event, context): # 从S3触发事件中获取桶名和文件键(根据实际触发源调整逻辑) bucket = event['Records'][0]['s3']['bucket']['name'] key = event['Records'][0]['s3']['object']['key'] # 直接在内存中读取S3文件内容,无需临时文件 s3_response = s3.get_object(Bucket=bucket, Key=key) raw_csv = s3_response['Body'].read().decode('utf-8') # 用内存流包装CSV内容,供DictReader解析 csv_stream = io.StringIO(raw_csv) dict_reader = csv.DictReader(csv_stream) # 实现数值类型自动转换逻辑 def parse_value(raw_str): try: return int(raw_str) except ValueError: try: return float(raw_str) except ValueError: return raw_str.strip() # 生成带类型转换的对象数组 formatted_result = [] for row in dict_reader: processed_row = {header: parse_value(value) for header, value in row.items()} formatted_result.append(processed_row) return { 'statusCode': 200, 'body': json.dumps(formatted_result, indent=2) }
核心修改说明
- 移除临时文件依赖:直接通过
s3.get_object获取文件字节流,解码后用io.StringIO包装成内存流,全程在内存中完成CSV解析,彻底删除临时文件相关的读写逻辑。 - 转换为对象数组:使用
csv.DictReader自动将CSV表头作为字典键,每行数据对应为键值对,直接生成符合需求的对象结构。 - 数值类型修正:自定义
parse_value函数,依次尝试将字符串转换为整数、浮点数,转换失败则返回清理后的原字符串,保证数值类型准确。 - 触发事件适配:代码默认适配S3上传触发事件,若使用API Gateway等其他触发方式,需调整
bucket和key的获取逻辑。
额外优化提示
- 若CSV使用非UTF-8编码,需修改
decode方法的参数(如gbk)。 - 处理超大CSV文件时,可改用逐行流式解析,避免内存溢出。
- 可扩展
parse_value函数,添加日期格式转换等自定义类型处理逻辑。
内容的提问来源于stack exchange,提问作者bob
相关产品推荐
相关产品推荐

