如何解决将 csv 数据写入 Amazon DynamoDB 表的 AWS lambda 函数
以下是在将 csv 文件上传到 Amazon S3 存储桶并将数据写入 Amazon DynamoDB 表时触发 lambda 函数的代码。我收到错误“预期的 str、字节或 os.pathLike 对象,而不是 dict”。
能否请您指出我犯的错误在哪里。
import boto3
import csv
s3_client = boto3.client('s3')
dynamodb = boto3.resource('dynamodb')
#table = dynamodb.Table('batch_data')
def csv_write(table_name,rows):
table = dynamodb.Table(table_name)
with table.csv_write() as batch:
for row in rows:
batch.put_item(Item=row)
return True
def read_csv(csv_file,list):
rows = csv.DictReader(open(csv_file))
for row in rows:
list.append(row)
def lambda_handler(event,context):
try:
bucket = event['Records'][0]['s3']['bucket']['name']
csv_file_name = event['Records'][0]['s3']['object']['key']
response = s3_client.get_object(Bucket=bucket,Key= csv_file_name)
table_name = 'batch_data'
items = []
read_csv(response,items)
status = csv_write(table_name,items)
if(status):
print('Data saved')
else:
print('Error in saving data...')
except Exception as err:
print (err)
```
解决方法
可能您的存储桶或 csv_file_name 无意中是一个字典,即您没有穷尽事件的层次结构
,这一行:
response = s3_client.get_object(Bucket=bucket,Key= csv_file_name)
像这样返回一个对象:
{
'Body': StreamingBody(),'LastModified': datetime(2015,1,1),'ContentLength': 123,...
}
这一行:
read_csv(response,items)
正在将 response
作为 csv_file
传递给这个函数:
def read_csv(csv_file,list):
rows = csv.DictReader(open(csv_file))
...
但是,open()
命令不知道如何解释来自 S3 的响应对象。这就是它返回错误的原因:
预期的 str、bytes 或 os.PathLike 对象,而不是 dict
根据来自 How do I read a csv stored in S3 with csv.DictReader? 的信息,我得到了这段代码:
import boto3
import csv
def lambda_handler(event,context):
s3_client = boto3.client('s3')
bucket = event['Records'][0]['s3']['bucket']['name']
csv_file_name = event['Records'][0]['s3']['object']['key']
response = s3_client.get_object(Bucket=bucket,Key= csv_file_name)
lines = response['Body'].read().decode('utf-8').split()
for row in csv.DictReader(lines):
print(row)
您可以使用该方法从 StreamingBody
返回的 get_object()
中读取 CSV。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。