首页 > 解决方案 > 在 Lambda 中读取 AWS S3 CSV 列名称

问题描述

我正在尝试编写一个脚本,该脚本从 AWS Aurora Serverless MySQL 数据库表中收集架构,从存储在 AWS S3 存储桶中的 CSV 文件中收集列标题,并且仅在其列标题是子集时才将 CSV 写入表模式(例如,如果表字段是 ['Name', 'DOB', 'Height'] 但 CSV 字段是 ['Name', 'DOB', 'Weight'] 脚本将抛出异常。

到目前为止,我已经成功地在 AWS Lambda 函数中返回了表架构,并成功读取了 CSV 文件,但我不确定如何从 S3 对象中获取列标题。

def return_db_schema(event):
    schema = []
    conn = pymysql.connect(rds_host, user=name, passwd=password, db=db_name, connect_timeout=5)
    with conn.cursor() as cur:
        cur.execute('SHOW columns FROM SampleTable')
        conn.commit()
        cur.close()
        for row in cur:
            schema.append(list(row)[0])
        return schema

def return_csv_cols(event):
    s3 = boto3.client('s3')
    tester = s3.get_object(Bucket=s3_bucket, Key=test_key)
    contents = tester['Body'].read()

def main(event, context):
    print(return_db_schema(event))
    print()
    print(return_csv_cols(event))

我不确定如何从这里开始(例如,有没有办法在不将 CSV 加载到 pandas DataFrame 并调用df.columns()或类似的东西的情况下做到这一点?)。

标签: pythoncsvamazon-s3aws-lambdaboto3

解决方案


我已经用以下代码解决了这个问题:

    s3 = boto3.client('s3')
    tester = s3.get_object(Bucket=s3_bucket, Key=test_key)
    contents = tester['Body'].read().decode('UTF-8')
    cols = contents.split('\n')[0].split(',')
    return cols, contents

推荐阅读