如何将Amazon S3存储桶Excel文件转为CSV存回同桶 含Python及Lambda触发方法
S3 Excel转CSV(同桶存储)Python实现及S3触发配置
基础Python实现(可本地/ECS等环境运行)
需要提前安装依赖库:pip install boto3 pandas openpyxl
import boto3 import pandas as pd from io import BytesIO s3 = boto3.client('s3') BUCKET_NAME = "替换为你的S3桶名" def excel_to_csv(excel_key, csv_key=None): # 读取S3中的Excel文件 response = s3.get_object(Bucket=BUCKET_NAME, Key=excel_key) excel_content = BytesIO(response['Body'].read()) # 读取Excel第一个工作表,可根据需求修改sheet_name参数指定工作表 df = pd.read_excel(excel_content, engine='openpyxl', sheet_name=0) # 未指定CSV存储路径时默认和Excel同目录,替换后缀为.csv if not csv_key: csv_key = excel_key.rsplit('.', 1)[0] + '.csv' # 将CSV写入同S3桶 csv_buffer = BytesIO() df.to_csv(csv_buffer, index=False, encoding='utf-8-sig') csv_buffer.seek(0) s3.put_object(Bucket=BUCKET_NAME, Key=csv_key, Body=csv_buffer) print(f"CSV已生成:s3://{BUCKET_NAME}/{csv_key}") # 调用示例 # excel_to_csv("source/数据文件.xlsx")
注意事项
- 运行环境需要配置有权限读取和写入目标S3桶的AWS凭证,IAM权限至少包含
s3:GetObject、s3:PutObject - 若Excel文件超过100MB,建议改用分块读取逻辑避免内存溢出
- 多工作表场景可自行扩展循环读取多个sheet生成对应CSV的逻辑
Lambda自动触发实现方案
Lambda默认运行环境没有pandas、openpyxl依赖,需要提前打包为Lambda层挂载到函数,或者使用包含数据处理库的公共Lambda层。
import boto3 import pandas as pd from io import BytesIO s3 = boto3.client('s3') def lambda_handler(event, context): # 解析S3触发事件获取文件信息 record = event['Records'][0] bucket_name = record['s3']['bucket']['name'] excel_key = record['s3']['object']['key'] # 过滤非Excel文件的触发事件 if not excel_key.lower().endswith(('.xlsx', '.xls')): return {"status": "skip", "reason": "非Excel文件"} # 读取Excel并转CSV try: response = s3.get_object(Bucket=bucket_name, Key=excel_key) excel_content = BytesIO(response['Body'].read()) df = pd.read_excel(excel_content, engine='openpyxl', sheet_name=0) csv_key = excel_key.rsplit('.', 1)[0] + '.csv' csv_buffer = BytesIO() df.to_csv(csv_buffer, index=False, encoding='utf-8-sig') csv_buffer.seek(0) s3.put_object(Bucket=bucket_name, Key=csv_key, Body=csv_buffer) return {"status": "success", "csv_key": csv_key} except Exception as e: print(f"处理失败:{str(e)}") raise e
Lambda配置注意点
- 函数执行角色的IAM权限需要包含S3读写权限、Lambda基本执行权限(CloudWatch日志写入权限)
- 根据Excel文件大小调整Lambda内存和超时时间,建议最小配置256MB内存、1分钟超时,大文件可对应调高
- 挂载的Lambda层需要和Lambda运行的Python版本(建议3.9/3.10)架构匹配
S3触发器配置步骤
- 进入目标S3桶的「属性」页面,下拉找到「事件通知」板块,点击「创建事件通知」
- 填写事件名称,前缀可按需配置(比如只触发source/目录下的文件就填
source/),后缀填.xlsx和.xls - 事件类型选择「所有对象创建事件」,或者只选「Put」「Post」「多部分上传完成」按需选择
- 目标选择「Lambda函数」,选择你提前创建好的Excel转CSV Lambda函数,保存即可
- 注意:要避免循环触发,不要配置后缀包含.csv的事件,生成的CSV不要和触发规则匹配
内容的提问来源于stack exchange,提问作者Mishra
相关产品推荐
相关产品推荐

