Python AWS Lambda-读取csv并转换为数据帧

Python AWS Lambda-读取csv并转换为数据帧,python,pandas,aws-lambda,Python,Pandas,Aws Lambda,我有一个简单的Lambda代码来读取S3 Bucket中的csv文件。一切正常,但我试图将csv数据获取到熊猫数据帧,出现错误字符串索引必须为整数 我的代码是bog标准,但我只需要使用csv作为进一步操作的数据帧。散列行是错误的来源。我可以毫无问题地打印数据,以便正确配置存储桶和文件详细信息 更新代码 import json import pandas as pd import numpy as np import requests import glob import time import

我有一个简单的Lambda代码来读取S3 Bucket中的csv文件。一切正常,但我试图将csv数据获取到熊猫数据帧,出现错误
字符串索引必须为整数

我的代码是bog标准,但我只需要使用csv作为进一步操作的数据帧。散列行是错误的来源。我可以毫无问题地打印数据,以便正确配置存储桶和文件详细信息

更新代码

import json
import pandas as pd
import numpy as np
import requests
import glob
import time
import os
from datetime import datetime
from csv import reader
import boto3
import traceback
import io

s3_client = boto3.client('s3')

def lambda_handler(event, context):
    try:
            
        bucket_name = event["Records"][0]["s3"]["bucket"]["name"]
        s3_file_name = event["Records"][0]["s3"]["object"]["key"]
        resp = s3_client.get_object(Bucket=bucket_name, Key=s3_file_name)
        
        data = resp['Body'].read().decode('utf-8')
        df=pd.DataFrame( list(reader(data)))
        print (df.head())

    except Exception as err:
        print(err)
        

        
        
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello fr2om Lambda!')
    }
    
    traceback.print_exc()

我相信您的问题可能与函数中的这一行-df=pd.DataFrame(list(reader(data)))有关。下面的答案应该允许您将csv文件读取到进程的数据框中

import boto3
import pandas as pd
from io import BytesIO

s3_client = boto3.client('s3')

def lambda_handler(event, context):
   try:
       bucket_name = event["Records"][0]["s3"]["bucket"]["name"]
       s3_file_name = event["Records"][0]["s3"]["object"]["key"]
       resp = s3_client.get_object(Bucket=bucket_name, Key=s3_file_name)

       ###########################################
       # one of these methods should work for you. 
       # Method 1
       # df_s3_data = pd.read_csv(resp['Body'], sep=',')
       #
       # Method 2
       # df_s3_data = pd.read_csv(BytesIO(resp['Body'].read().decode('utf-8')))
       ###########################################
       print(df_s3_data.head())

   except Exception as err:
      print(err)

您可以使用read_csv直接从pandas读取S3文件:

s3\u client=boto3.client('s3')
def lambda_处理程序(事件、上下文):
尝试:
bucket_name=event[“Records”][0][“s3”][“bucket”][“name”]
s3_file_name=事件[“记录”][0][“s3”][“对象”][“键”]
#这种“魔力”需要s3fs(https://pypi.org/project/s3fs/)
df=pd.read_csv(f's3://{bucket_name}/{s3_file_name}',sep=',')
打印(df.head())
除异常作为错误外:
打印(错误)
要记住的东西:
  • Pandas需要读取远程文件-请参阅Pandas文档()中的[读取远程文件])

  • 您需要用lambda打包s3fs库-请参阅

  • 如果你在lambda之外使用它(用于thesting),那么棘手的部分是身份验证

  • 由于您需要支付CPU和内存使用费,Pandas可能会帮助您评估CSV内存使用和/或排除内存不足错误:

#以CPU为成本跟踪内存使用情况。非常适合故障排除。明智地使用。
打印(df.info(verbose=True,memory\u usage='deep'))
导入json
作为pd进口熊猫
将numpy作为np导入
导入请求
导入glob
导入时间
导入操作系统
从日期时间导入日期时间
从csv导入读取器
进口boto3
输入io
s3\u client=boto3.client('s3'))
def lambda_处理程序(事件、上下文):
尝试:
bucket_name=event[“Records”][0][“s3”][“bucket”][“name”]
s3_file_name=事件[“记录”][0][“s3”][“对象”][“键”]
obj=s3\u client.get\u对象(Bucket=Bucket\u name,Key=s3\u file\u name)
df=pd.read_csv(obj['Body'])#'Body'是一个关键词
打印(df.head())
除异常作为错误外:
打印(错误)
#待办事项实施
返回{
“状态代码”:200,
'body':json.dumps('Hello fr2om Lambda!')
}

请包含回溯消息,以便我们能够轻松发现错误线路。您是否尝试过
pd.read\u csv(data)
?当您遇到类似
事件[“记录”][0][“s3”][“bucket”][“name”]
的问题时,您可以扔掉一些代码来缩小范围<代码>事件[“记录”]
后接
事件[“记录”][0][“s3”]
和``事件[“记录”][0][“s3”][“桶”]`。无论哪一个爆炸都会让你知道问题所在。你可以
导入回溯
,然后在异常处理程序中添加
回溯。print_exc()
。你说代码现在可以工作了,但它不工作?到底是什么问题,预期的结果是什么,你能澄清一下吗?不。它没有给我从文件中解析的列
@Kalenji你试过注释掉的第二个df_s3_数据了吗?方法1成功了!还有一个问题,您是否根据文件名的部分将文件从S3获取到lambda?