Как прочитать CSV-файл из S3 Bucket в AWS Lambda? - PullRequest
0 голосов
/ 02 июля 2019

Я пытаюсь прочитать содержимое файла CSV, который был загружен в корзину s3.Для этого я получаю имя корзины и ключ файла из события, которое вызвало лямбда-функцию, и читаю его построчно.Вот мой код:

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

Ответы [ 2 ]

0 голосов
/ 02 июля 2019

csvfile['Body'] тип StreamingBody, поэтому вы не можете использовать open xx with.

этот код прочитал все данные из потока.

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

так что разбирайте строку, чтобы получить более полезный контент.

0 голосов
/ 02 июля 2019
csvfile = s3.get_object(Bucket=bucket, Key=file_key)
csvcontent = csvfile['Body'].read().split(b'\n')

Здесь вы уже получили содержимое файла и разбили его на строки. Я не уверен, почему вы пытаетесь open что-то снова, вы можете просто передать csvcontent в ваш ридер:

csv_data = csv.DictReader(csvcontent)
...