将 S3 中的 excel 文件读入 Pandas DataFrame

Posted

技术标签:

【中文标题】将 S3 中的 excel 文件读入 Pandas DataFrame【英文标题】:Read excel file from S3 into Pandas DataFrame 【发布时间】:2019-06-08 16:16:51 【问题描述】:

我有一个 SNS 通知设置,当 .xlsx 文件上传到 S3 存储桶时会触发 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'>

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

这很正常! obj 是字典,你试过吗?

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

【讨论】:

就是这样。 df = pd.read_excel(obj['body'], header=2)。您的帖子缺少“body”的关闭]。感谢您的帮助。 我的荣幸 :) P.S:我已经添加了]【参考方案2】:

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

查看此处的 CSV 示例 - https://***.com/a/51777553/52954

【讨论】:

【参考方案3】:

试试pd.read_excel(obj['Body'].read())

【讨论】:

【参考方案4】:

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

df = pd.DataFrame.from_dict(obj)

Documentation here 如果您需要更改参数。

【讨论】:

以上是关于将 S3 中的 excel 文件读入 Pandas DataFrame的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 可以将 Excel 组结构读入 Multiindex 吗?

使用 lambda 中的 pandas 从 s3 读取 excel 文件并转换为 csv

将 Excel 命名范围读入 pandas DataFrame

只将包含某个单词的 Excel sheet_names 读入 pandas 数据框

Pandas 无法读取 S3 excel 文件。错误:无法确定 Excel 文件格式

将excel电子表格读入pandas DataFrame时将数字转换为字符串