如何使用AWS Lambda将S3存储桶中的JSON文件转换为CSV格式
基于现有代码修改后的JSON转CSV Lambda实现
以下代码默认你存放在S3的JSON文件为对象数组结构,如果是单JSON对象需要单独调整
import json import csv import boto3 import os import datetime as dt s3 = boto3.client('s3') def lambda_handler(event, context): datestamp = dt.datetime.now().strftime("%Y/%m/%d") timestamp = dt.datetime.now().strftime("%s") filename_csv = f"/tmp/file_{timestamp}.csv" # 输出路径改为CSV后缀 keyname_s3 = f"uploads/output/{datestamp}/{timestamp}.csv" for record in event['Records']: bucket_name = record['s3']['bucket']['name'] key_name = record['s3']['object']['key'] # 从S3读取JSON文件并解析 s3_object = s3.get_object(Bucket=bucket_name, Key=key_name) data = s3_object['Body'].read() json_data = json.loads(data.decode('utf-8')) # 解析JSON生成CSV if json_data: # 取第一个JSON对象的所有键作为CSV表头 headers = list(json_data[0].keys()) with open(filename_csv, 'w', newline='', encoding='utf-8') as csv_file: writer = csv.DictWriter(csv_file, fieldnames=headers) # 写入表头 writer.writeheader() # 批量写入所有行数据 writer.writerows(json_data) # 上传转换后的CSV到S3 with open(filename_csv, 'r') as csv_file_contents: s3.put_object(Bucket=bucket_name, Key=keyname_s3, Body=csv_file_contents.read()) # 清理临时文件 os.remove(filename_csv) return { 'statusCode': 200, 'body': json.dumps(f'JSON converted to CSV and available at: {bucket_name}/{keyname_s3}') }
核心修改点
- 翻转了转换逻辑:先读取S3的JSON内容反序列化为Python列表,再通过
csv.DictWriter写入CSV文件 - 调整了输出S3对象的后缀为
.csv,匹配转换后的文件格式 - 去掉了冗余的临时文件写入逻辑,减少IO操作
- 增加了表头自动提取逻辑,默认取第一个JSON对象的键作为CSV列名
注意事项
- 如果你的JSON文件是嵌套结构,需要提前把嵌套字段扁平化再写入CSV,否则会直接写入对象字符串
- 触发Lambda的S3事件前缀不要和输出路径重叠,避免循环触发
- 如果JSON文件体积超过Lambda临时目录(/tmp)512MB限制,需要调整为流式读写逻辑
内容的提问来源于stack exchange,提问作者prodnose
相关产品推荐
相关产品推荐

