【发布时间】: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 但它引发语法错误
还有没有更好的方法来编写满足我要求的代码?
【问题讨论】:
-
您是否按照错误信息的提示安装了 xlrd?
-
我建议您在本地尝试一下,然后将在您的 lambda 中工作的库与您的代码一起打包
-
@petezurich 我在 lambda 上运行它,当我导入 xlrd 时,它抛出语法错误
-
@Tejas 这是意料之中的,因为您还没有为您的 lambda 函数安装 xlrd。见 Ninad Gaikwad 评论。您需要打包默认未安装的库,并将它们与您的代码一起上传(例如,作为 zip 文件)。
标签: python amazon-web-services amazon-s3 aws-lambda boto3