当前位置: 首页 > 知识库问答 >
问题:

使用Boto3 S3和Lambda自动创建CSV文件

吴凯
2023-03-14

我正在LinuxAcademy网站上做一个实验室。com课程名称是使用Lambda、Python和Boto3自动化自动气象站,我遇到问题的具体实验室是讲座:将CSV文件导入DynamoDB。

在这个实验室中,我们将一个. csv文件上传到S3,在该特定桶中生成一个S3事件,然后启动如下所示的Lambda脚本:

import csv
import os
import tempfile

import boto3

dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('Movies')
s3 = boto3.client('s3')


def lambda_handler(event, context):

    for record in event['Records']:
        source_bucket = record['s3']['bucket']['name']
        key = record['s3']['object']['key']
        with tempfile.TemporaryDirectory() as tmpdir:
            download_path = os.path.join(tmpdir, key)
            s3.download_file(source_bucket, key, download_path)
            items = read_csv(download_file)

            with table.batch_writer() as batch:
                for item in items:
                    batch.put_item(Item=item)


def read_csv(file):
    items=[]
    with open(file) as csvfile:
        reader = csv.DictReader(csvfile)
        for row in reader:
            data = {}
            data['Meta'] = {}
            data['Year'] = int(row['Year'])
            data['Title'] = row['Title'] or none
            data['Meta']['Length'] = int(row['Length'] or 0)
            #data['Meta']['Length'] = int(row['Length'] or 0)
            data['Meta']['Subject'] = row['Subject'] or None
            data['Meta']['Actor'] = row['Actor'] or None
            data['Meta']['Actress'] = row['Actress'] or None
            data['Meta']['Director'] = row['Director'] or None
            data['Meta']['Popularity'] = row['Popularity'] or None
            data['Meta']['Awards'] = row['Awards'] == 'Yes'
            data['Meta']['Image'] = row['Image'] or None
            data['Meta'] = {k: v for k,
                            v in data['Meta'].items() if v is not None}

上传到s3的.csv文件确实调用了lambda函数。第20行出现错误:items=read\u csv(download\u file)

AWS CloudWatch出错:

[ERROR] NameError: name 'download_file' is not defined
Traceback (most recent call last):
  File "/var/task/lambda_function.py", line 20, in lambda_handler
    items = read_csv(download_file)

共有1个答案

韩弘方
2023-03-14
s3.download_file(source_bucket, key, download_path)
items = read_csv(download_file)

第一行调用Amazon S3客户端上的下载文件()方法,将文件下载到本地磁盘。

第二行调用read\u csv()函数,传递一个名为download\u file的变量。但是,尚未定义名为下载文件的变量,这就是您收到错误的原因。

在查看代码时,read_csv()函数期望打开文件名。这似乎在download_path变量中可用,其中包含本地目录和密钥。因此,将其更改为:

items = read_csv(download_path)
 类似资料:
  • 下面是我的一些代码: 谢谢你的协助。

  • 问题内容: 我想创建一个csv文件,但是当我运行代码时,它返回一个空白页,没有csv文件。我使用PHP5。我使用以下代码: 谢谢! 问题答案: 其空白,因为您正在写信。您应该写到using 代替,还应该发送标头信息以表明它是csv。 例

  • 问题内容: 如何自动创建pyi文件的样板代码? 我想创建一个保华集团的类型描述暗示文件pep484其中包含了所有的方法名。 我不要魔术。我要在自动创建文件后添加类型信息。 我想避免复制+粘贴工作。 目标:在PyCharm for Python2中键入提示。 问题答案: 就我而言,PyCharm中没有此类直接工具。但是,有用于此目的的第三方工具。 MyPy 是的,我想任何想在Python中使用编译时

  • 请有人给我指个正确的方向。

  • 我想创造一个新的世界。cmd文件,用于过滤所有。csv文件,然后创建一组。包含结果的csv文件。 下面是一个场景。 有很多。文件夹中的csv文件csv文件中的第一列数据包含一个代码在哪里可以是任何一组数字,范围从 我希望批处理文件在01开始XX,在那里找到HH?????-01,它取行并将结果放入名为的输出文件中 开始时的代码可能不同,因此它还必须过滤 然后对文件夹中的每个csv文件重复此操作。 然

  • 问题内容: 我刚刚了解到MySQL具有本地CSV存储引擎,该引擎将数据存储在每个表的逗号分隔值文件中。 是否可以直接从上传的CSV文件创建表格,例如: 用户在哪里上传? 问题答案: 这不可能。要创建表,您需要一个表架构。您拥有的是一个数据文件。无法使用它创建模式。 您可以做的是检查文件中是否有标题行,在这种情况下,您可以使用该标题行手动创建表。 但是,有一种使用批处理文件生成create tabl