如何在AWS Lambda中从S3存储桶读取CSV文件?

11

我正在尝试读取上传到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不熟悉。


1
csvcontent 已经包含了您的数据。无需打开文件。csvcontent 实际上是一个字符串列表(行),您可以解析它。 - balderman
3个回答

24
从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])

你知道如何在Lambda中将CSV文件作为数据框获取吗? - Kalenji
请注意,如果您仍然使用utf-8时出现奇怪的字符,请尝试使用utf-8-sig,因为它将字节顺序标记视为信息而不是字符串。请参见https://dev59.com/3lMI5IYBdhLWcg3wDnKG。 - deesolie

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

在这里,您已经检索到文件内容并将其拆分成行。我不确定您为什么要再次尝试打开某个东西,您只需将csvcontent传递给您的读取器即可:

csv_data = csv.DictReader(csvcontent)

1
对于小的CSV文件,可以。但是对于大文件,这段代码会耗尽所有内存并卡住。 - sheetal
1
在您的情况下,s3是boto3.client("s3")还是boto3.resource("s3")? - Janzaib M Baloch

1

csvfile['Body'] 的类型为 StreamingBody,因此您不能使用 open xx with

该代码已从流中读取所有数据。

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

所以只需解析该行以获取更有用的内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接