如何在AWS Lambda中使用openpyxl处理S3存储的Excel且不重写原有逻辑
解决方案
你可以完全保留原有数据处理逻辑,无需重写,有两种常用实现方案:
方案1:使用Lambda临时目录(最贴近本地操作习惯,零逻辑改动)
Lambda运行环境自带/tmp临时存储空间,你可以将S3上的Excel文件下载到这个目录,后续操作和本地完全一致,仅需替换文件路径即可。
import boto3 import openpyxl import csv # 初始化S3客户端 s3 = boto3.client('s3') # 配置参数 SOURCE_BUCKET = '你的源S3桶名' EXCEL_KEY = 'test.xlsx' # S3上Excel文件的路径 TMP_EXCEL_PATH = '/tmp/test.xlsx' TMP_CSV_PATH = '/tmp/test.csv' TARGET_BUCKET = '你的目标S3桶名' TARGET_CSV_KEY = '格式化后的结果/test.csv' # 存到S3的目标路径 # 1. 从S3下载文件到临时目录 s3.download_file(SOURCE_BUCKET, EXCEL_KEY, TMP_EXCEL_PATH) # 2. 调用原有openpyxl逻辑,仅替换文件路径即可,和本地写法完全一致 wb = openpyxl.load_workbook(TMP_EXCEL_PATH, data_only=True) # 3. 你原有的冗长数据处理、转CSV逻辑完全不用修改,直接复用 # -------------原有逻辑直接粘贴到这里即可------------- # 示例:原有写入CSV的逻辑,直接写临时目录路径即可 # sheet = wb.active # with open(TMP_CSV_PATH, 'w', newline='', encoding='utf-8') as f: # writer = csv.writer(f) # for row in sheet.rows: # writer.writerow([cell.value for cell in row]) # -------------------------------------------------- # 4. 把生成的CSV上传回S3 s3.upload_file(TMP_CSV_PATH, TARGET_BUCKET, TARGET_CSV_KEY)
方案2:内存流处理(无磁盘IO,适合小文件)
如果你的Excel文件体积不大,可以直接将S3文件读取为内存字节流传给openpyxl,不需要写入本地临时目录。
import boto3 from io import BytesIO, StringIO import openpyxl import csv s3 = boto3.client('s3') SOURCE_BUCKET = '你的源S3桶名' EXCEL_KEY = 'test.xlsx' TARGET_BUCKET = '你的目标S3桶名' TARGET_CSV_KEY = '格式化后的结果/test.csv' # 1. 读取S3文件到内存字节流 response = s3.get_object(Bucket=SOURCE_BUCKET, Key=EXCEL_KEY) excel_stream = BytesIO(response['Body'].read()) # 2. 直接传流给openpyxl,后续处理逻辑和本地完全一致 wb = openpyxl.load_workbook(excel_stream, data_only=True) # 3. 原有数据处理逻辑直接复用,无需修改 # -------------原有逻辑直接粘贴到这里即可------------- # 转CSV后如果要存在内存里上传可以用StringIO,示例: # csv_stream = StringIO() # writer = csv.writer(csv_stream) # sheet = wb.active # for row in sheet.rows: # writer.writerow([cell.value for cell in row]) # -------------------------------------------------- # 4. 内存中的CSV内容直接上传S3 s3.put_object( Body=csv_stream.getvalue(), Bucket=TARGET_BUCKET, Key=TARGET_CSV_KEY )
注意事项
- 你需要提前将
openpyxl依赖打包为Lambda层挂载到函数上,Lambda默认Python运行环境不包含该库 - Lambda默认
/tmp目录最大容量为512MB,若处理的文件超过该大小,可在函数配置的「常规配置」-「临时存储」中调整上限最高到10GB - 为Lambda的执行角色配置对应S3桶的读写权限:源桶需要
s3:GetObject权限,目标桶需要s3:PutObject权限 - 如果配置S3触发器自动触发函数运行,可以直接从事件参数中解析触发的桶名和文件Key,无需硬编码路径
内容的提问来源于stack exchange,提问作者Ludwig
相关产品推荐
相关产品推荐

