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

Posted

技术标签:

【中文标题】使用 lambda 中的 pandas 从 s3 读取 excel 文件并转换为 csv【英文标题】:Reading excel file from s3 using pandas in lambda and convert to csv 【发布时间】:2019-10-09 14:02:19 【问题描述】:

我正在尝试使用 lambda 中的 python 从 s3 存储桶中读取 excel 文件,使用 pandas 进行一些操作,将其转换为 csv 并放回同一个存储桶。

import pandas as pd
import boto3
import os
from urllib.parse import unquote_plus

    def lambda_handler(event, context):
        s3=boto3.client('s3')
        if event:

            file_obj=event['Records'][0]
            bucket = event['Records'][0]['s3']['bucket']['name']
            key = event['Records'][0]['s3']['object']['key'].encode('utf-8')
            filename=unquote_plus(key)
            ----this line throws error "a bytes-like object is required, not 'str': TypeError"

            print("Filename:",filename)
            q=(os.path.splitext(os.path.basename(filename))[0]) #read filename
            print(q)
            obj=s3.get_object(Bucket=bucket,Key=filename)
            print(obj['Body'])                       
            pd.read_excel(obj['Body'],index_col=False,header=5,usecols="A,C:M,U")
            df=df[:-1]                             
            df=df.replace(np.nan,'')                

            print(df)
            dfcsv = df.to_csv('s3://bucket/sales.csv' ,sep='\t',encoding='utf-8',index=False) #converttocsv

这会引发错误:

安装 xlrd >= 1.0.0 以获得 Excel 支持:ImportError

此外,此代码在本地环境中运行良好,但在 lambda 中失败。

我尝试导入 xlrd 但它引发语法错误

还有没有更好的方法来编写满足我要求的代码?

【问题讨论】:

Python: Pandas pd.read_excel giving ImportError: Install xlrd >= 0.9.0 for Excel support的可能重复 您是否按照错误信息的提示安装了 xlrd? 我建议您在本地尝试一下,然后将在您的 lambda 中工作的库与您的代码一起打包 @petezurich 我在 lambda 上运行它,当我导入 xlrd 时,它抛出语法错误 @Tejas 这是意料之中的,因为您还没有为您的 lambda 函数安装 xlrd。见 Ninad Gaikwad 评论。您需要打包默认未安装的库,并将它们与您的代码一起上传(例如,作为 zip 文件)。 【参考方案1】:

如果要包含不属于 Python 标准库的库,例如 xlrd,可以使用 lambda's layers。


1.创建压缩包

这是一个 zip,其中包含您希望 lambda 函数使用的所有库。 首先,创建一个名为python的文件夹:

$ mkdir python
$ cd python

然后,在其中安装您需要的 Python 库。您可以使用单个库来执行此操作:

$ pip install --target . xlrd

或带有库列表(requirements.txt)

$ pip install --target . -r requirements.txt

最后,把所有东西都拉上拉链。

...在 Bash 中:

$ zip -r dependencies.zip ../python

...在 Powershell 中:

$ Compress-Archive -Path . -DestinationPath dependencies.zip

2。创建图层

您可以在 AWS 控制台或 CLI 中执行此操作。关注these instructions。


3.将图层添加到 lambda 函数中

您可以使用 lambda 页面或 CLI 中的 Add a layer 选项来执行此操作。关注these instructions。

【讨论】:

以上是关于使用 lambda 中的 pandas 从 s3 读取 excel 文件并转换为 csv的主要内容,如果未能解决你的问题,请参考以下文章

从 VPC 中的 Lambda 访问 AWS S3

AWS Lambda 中的 Amazon S3 waitFor()

使用 Lambda 节点从 S3 上的文件在 S3 上创建一个 zip 文件

NodeJS - 从 S3 读取文件到 Lambda 中的 /tmp 文件夹

如何从AWS Lambda检索数据并将其显示在AWS S3托管的静态网站上?

从 Lambda 中的 S3 通知事件获取非 ASCII 文件名