从S3读取Excel文件到Pandas DataFrame

8

我设置了一个SNS通知,当S3存储桶上传.xlsx文件时,会触发一个Lambda函数。

该Lambda函数将读取.xlsx文件到Pandas DataFrame中。

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'>

我该如何解决这个问题?
4个回答

8

这是很正常的!obj是一个字典,你试过了吗?

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

就是这样。df = pd.read_excel(obj['body'], header=2)。你的帖子缺少了'body'的闭合括号。感谢您的帮助。 - Raj
很高兴为您效劳 :) 附注:我已经添加了"]" - Tarik Elkalai

2
尝试使用pd.read_excel(obj['Body'].read())

2

0
如果obj是一个字典,你可以尝试使用以下方法:
df = pd.DataFrame.from_dict(obj)

如果需要更改参数,请点击这里查看文档。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接