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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 17:31:57