Python 将excel文件从S3读入数据框

Python 将excel文件从S3读入数据框,python,pandas,amazon-s3,lambda,Python,Pandas,Amazon S3,Lambda,我有一个SNS通知设置,当一个.xlsx文件上传到S3 bucket时,它会触发一个Lambda函数 lambda函数将.xlsx文件读入数据帧 import os import pandas as pd import json import xlrd import boto3 def main(event, context): message = event['Records'][0]['Sns']['Message'] parsed_message = json.load

我有一个SNS通知设置,当一个.xlsx文件上传到S3 bucket时,它会触发一个Lambda函数

lambda函数将.xlsx文件读入数据帧

import os 
import pandas as pd
import json
import xlrd
import boto3

def main(event, context):
    message = event['Records'][0]['Sns']['Message']
    parsed_message = json.loads(message)
    src_bucket = parsed_message['Records'][0]['s3']['bucket']['name']
    filepath = parsed_message['Records'][0]['s3']['object']['key']

    s3 = boto3.resource('s3')
    s3_client = boto3.client('s3')

    obj = s3_client.get_object(Bucket=src_bucket, Key=filepath)
    print(obj['Body'])

    df = pd.read_excel(obj, header=2)
    print(df.head(2))
我得到一个错误,如下所示:

Invalid file path or buffer object type: <type 'dict'>: ValueError
Traceback (most recent call last):
File "/var/task/handler.py", line 26, in main
df = pd.read_excel(obj, header=2)
File "/var/task/pandas/util/_decorators.py", line 178, in wrapper
return func(*args, **kwargs)
File "/var/task/pandas/util/_decorators.py", line 178, in wrapper
return func(*args, **kwargs)
File "/var/task/pandas/io/excel.py", line 307, in read_excel
io = ExcelFile(io, engine=engine)
File "/var/task/pandas/io/excel.py", line 376, in __init__
io, _, _, _ = get_filepath_or_buffer(self._io)
File "/var/task/pandas/io/common.py", line 218, in get_filepath_or_buffer
raise ValueError(msg.format(_type=type(filepath_or_buffer)))
ValueError: Invalid file path or buffer object type: <type 'dict'>
无效的文件路径或缓冲区对象类型::ValueError
回溯(最近一次呼叫最后一次):
文件“/var/task/handler.py”,第26行,在main中
df=pd.read\u excel(对象,标题=2)
包装器中的文件“/var/task/pandas/util/_decorators.py”,第178行
返回函数(*args,**kwargs)
包装器中的文件“/var/task/pandas/util/_decorators.py”,第178行
返回函数(*args,**kwargs)
文件“/var/task/pandas/io/excel.py”,第307行,在read_excel中
io=ExcelFile(io,engine=engine)
文件“/var/task/pandas/io/excel.py”,第376行,在__
io、u、u、u=获取文件路径或缓冲区(self.\u io)
文件“/var/task/pandas/io/common.py”,第218行,在get_文件路径_或_缓冲区中
raise VALUERROR(消息格式(_type=type(文件路径或缓冲区)))
ValueError:无效的文件路径或缓冲区对象类型:

我该如何解决这个问题?

这完全正常!obj是一个词汇表,你试过了吗

df = pd.read_excel(obj['body'], header=2)

如果
obj
是一本字典,你可以试试

df = pd.DataFrame.from_dict(obj)

如果您需要更改参数。

熊猫现在支持S3URL作为文件路径,因此它可以直接从s3读取excel文件,而无需先下载


请参见此处的CSV示例-

就是这样。df=pd.read_excel(obj['body'],header=2)。您的帖子缺少“body”的结尾]。谢谢你的帮助。我的荣幸:)附言:我已经添加了