web-dev-qa-db-ja.com

AWS LambdaでS3バケットからCSVファイルを読む方法は?

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:
 _

誰かが私がこれを修正するのを手伝ってくれる?私はラムダの新しいものとして提供することができるすべての助けに感謝します

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

ここでは、ファイルの内容を取得して行に分割しています。 opencsvcontentを渡すことができます:

csv_data = csv.DictReader(csvcontent)
 _
4
tzaman

適切な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])
 _
9
nikita91000

_csvfile['Body']_ typeはStreamingBodyですので、_open xx with_を使用することはできません。

このコードはストリームからすべてのデータを読み取っていました。

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

そのため、JSUTはより有用にコンテンツを得るために行を解析します。

1
youDaily