如何用Python解析FormData?需提取字段并将CSV转为pandas DataFrame
Python解析AWS Lambda中的multipart/form-data:提取字段与CSV文件
问题场景
在AWS Lambda中处理前端上传的FormData时,已完成base64解码,但无法用json.loads解析(因为内容是multipart/form-data格式而非JSON)。解码后的内容包含文本字段(如username)和CSV文件,需要提取username并将CSV转为pandas DataFrame。
现有代码:
import base64 def lambda_handler(event, context): print(base64.b64decode(event['body'])) # dict_obj = json.loads(base64.b64decode(event['body'])) # 执行报错
解码后输出示例:
b'------WebKitFormBoundaryHFIqTxrMuAs5kep2\r\nContent-Disposition: form-data; name="username"\r\n\r\nTESTUSER\r\n------WebKitFormBoundaryHFIqTxrMuAs5kep2\r\nContent-Disposition: form-data; name="regionValue"\r\n\r\nreg\r\n------WebKitFormBoundaryHFIqTxrMuAs5kep2\r\nContent-Disposition: form-data; name="countryValue"\r\n\r\ncountry\r\n------WebKitFormBoundaryHFIqTxrMuAs5kep2\r\nContent-Disposition: form-data; name="gridValue"\r\n\r\ngrid\r\n------WebKitFormBoundaryHFIqTxrMuAs5kep2\r\nContent-Disposition: form-data; name="file1"; filename="Rate.csv"\r\nContent-Type: text/csv\r\n\r\nCluster Code,Pace Product Code...
解决方案
使用multipart库解析multipart/form-data格式的内容,步骤如下:
1. 依赖准备
AWS Lambda默认不包含multipart和pandas,需通过以下方式引入:
- 本地安装依赖后打包部署:
pip install multipart pandas -t ./package,再将package目录与Lambda代码一起打包 - 使用Lambda层管理这两个依赖
2. 完整解析代码
import base64 import multipart import pandas as pd from io import BytesIO def lambda_handler(event, context): # 1. 解码base64格式的请求体 body_bytes = base64.b64decode(event['body']) # 2. 从请求头获取boundary(multipart分隔符) content_type = event['headers'].get('Content-Type', '') boundary = content_type.split('boundary=')[-1].strip() # 3. 解析multipart数据 parser = multipart.MultipartParser(body_bytes, boundary) username = None csv_dfs = [] for part in parser.parts(): # 获取字段名 name = part.name # 处理文本字段 if name == 'username': # 读取文本内容并转码 username = part.read().decode('utf-8') # 处理CSV文件 elif part.filename and part.filename.endswith('.csv'): # 读取文件字节流,转为pandas DataFrame csv_content = BytesIO(part.read()) df = pd.read_csv(csv_content) csv_dfs.append(df) # 输出结果示例 print(f"提取的username: {username}") print(f"解析得到的CSV DataFrame数量: {len(csv_dfs)}") return { 'statusCode': 200, 'body': { 'username': username, 'csv_count': len(csv_dfs) } }
关键说明
- boundary获取:必须从请求头的
Content-Type中提取,确保解析时的分隔符与前端一致 - 文本字段处理:通过
part.read().decode('utf-8')将字节内容转为字符串 - CSV文件处理:用
BytesIO将文件字节流包装为可读取的文件对象,再传给pd.read_csv - 多文件处理:代码中用列表
csv_dfs存储所有CSV对应的DataFrame,可根据文件名(part.filename)区分不同文件
内容的提问来源于stack exchange,提问作者ReactNewbie123
相关产品推荐
相关产品推荐

