You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 03:24:06