微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将 csv 数据写入 Amazon DynamoDB 表的 AWS lambda 函数

如何解决将 csv 数据写入 Amazon DynamoDB 表的 AWS lambda 函数

以下是在将 csv 文件上传到 Amazon S3 存储桶并将数据写入 Amazon DynamoDB 表时触发 lambda 函数代码。我收到错误“预期的 str、字节或 os.pathLike 对象,而不是 dict”。

能否请您指出我犯的错误在哪里。

import boto3
import csv

s3_client = boto3.client('s3')
dynamodb = boto3.resource('dynamodb')
#table = dynamodb.Table('batch_data')

def csv_write(table_name,rows):
    table = dynamodb.Table(table_name)

    with table.csv_write() as batch:
        for row in rows:
            batch.put_item(Item=row)
    return True

def read_csv(csv_file,list):
    rows = csv.DictReader(open(csv_file))

    for row in rows:
        list.append(row)

def lambda_handler(event,context):
    try:

        bucket = event['Records'][0]['s3']['bucket']['name']
        csv_file_name = event['Records'][0]['s3']['object']['key']
        response = s3_client.get_object(Bucket=bucket,Key= csv_file_name)

        table_name = 'batch_data'
        items = []

        read_csv(response,items)
        status = csv_write(table_name,items)

        if(status):
            print('Data saved')
        else:
            print('Error in saving data...')
    except Exception as err:
        print (err)
    ```

解决方法

可能您的存储桶或 csv_file_name 无意中是一个字典,即您没有穷尽事件的层次结构

,

这一行:

response = s3_client.get_object(Bucket=bucket,Key= csv_file_name)

像这样返回一个对象:

{
    'Body': StreamingBody(),'LastModified': datetime(2015,1,1),'ContentLength': 123,...
}

这一行:

read_csv(response,items)

正在将 response 作为 csv_file 传递给这个函数:

def read_csv(csv_file,list):
    rows = csv.DictReader(open(csv_file))
    ...

但是,open() 命令不知道如何解释来自 S3 的响应对象。这就是它返回错误的原因:

预期的 str、bytes 或 os.PathLike 对象,而不是 dict

根据来自 How do I read a csv stored in S3 with csv.DictReader? 的信息,我得到了这段代码:

import boto3
import csv

def lambda_handler(event,context):
    
    s3_client = boto3.client('s3')
    
    bucket = event['Records'][0]['s3']['bucket']['name']
    csv_file_name = event['Records'][0]['s3']['object']['key']
    
    response = s3_client.get_object(Bucket=bucket,Key= csv_file_name)

    lines = response['Body'].read().decode('utf-8').split()
    for row in csv.DictReader(lines):
        print(row)

您可以使用该方法从 StreamingBody 返回的 get_object() 中读取 CSV。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?