如何从AWS Lambda的s3存储桶中读取csv文件?

时间:2019-07-02 09:24:16

标签: python aws-lambda boto3 aws-serverless s3-bucket

我正在尝试读取在s3存储桶中上传的csv文件的内容。为此,我从触发lambda函数的事件中获取存储桶名称和文件密钥,并逐行读取它。这是我的代码:

import json
import os
import boto3
import csv

def lambda_handler(event,  context):
    for record in event['Records']:
        bucket = record['s3']['bucket']['name']
        file_key = record['s3']['object']['key']
        s3 = boto3.client('s3')
        csvfile = s3.get_object(Bucket=bucket, Key=file_key)
        csvcontent = csvfile['Body'].read().split(b'\n')
        data = []
        with open(csvfile['Body'], 'r') as csv_file:
          csv_file = csv.DictReader(csv_file)
          data = list(csv_file)

我在CloudWatch上遇到的确切错误是:

[ERROR] TypeError: expected str, bytes or os.PathLike object, not list
Traceback (most recent call last):
  File "/var/task/lambda_function.py", line 19, in lambda_handler
    with open(csvcontent, 'r') as csv_file:

有人可以帮我解决这个问题吗?我非常感谢lambda

所提供的任何帮助。

3 个答案:

答案 0 :(得分:6)

以适当的方式从s3存储桶中获取CSV文件数据,并通过以下代码轻松检索索引格式对我有很大帮助:

key = 'key-name'
bucket = 'bucket-name'
s3_resource = boto3.resource('s3')
s3_object = s3_resource.Object(bucket, key)

data = s3_object.get()['Body'].read().decode('utf-8').splitlines()

lines = csv.reader(data)
headers = next(lines)
print('headers: %s' %(headers))
for line in lines:
    #print complete line
    print(line)
    #print index wise
    print(line[0], line[1])

答案 1 :(得分:0)

csvfile = s3.get_object(Bucket=bucket, Key=file_key)
csvcontent = csvfile['Body'].read().split(b'\n')

在这里,您已经检索了文件内容并将其分成几行。我不确定为什么您要再次尝试open,您可以将csvcontent传递给您的阅读器:

csv_data = csv.DictReader(csvcontent)

答案 2 :(得分:0)

csvfile['Body']类型为StreamingBody,所以您不能使用open xx with

此代码已读取流中的所有数据。

csvcontent = csvfile['Body'].read().split(b'\n')

因此jsut会解析该行以获得更多有用的内容。