用python解析csv文件,并将其作为lambda函数中的字典列表

iih3973s  于 2023-01-15  发布在  Python
关注(0)|答案(2)|浏览(110)

我正在尝试写一个lambda函数,它将标记ec2示例,这些示例将从挂起状态变为运行状态。但是,我在阅读保存ec2示例标记的csv文件时遇到了问题。目前,我已经转到lambda返回给我以下结果的地方。

START RequestId: 6290699e-4018-4801-b7a8-6b5b46f26c2a Version: $LATEST
{'Key': 'Name1', 'Value': 'Machine-1'}
{'Key': 'Name2', 'Value': 'Machine-2'}
{'Key': 'Name3', 'Value': 'Machine-3'}
END RequestId: 6290699e-4018-4801-b7a8-6b5b46f26c2a
REPORT RequestId: 6290699e-4018-4801-b7a8-6b5b46f26c2a  Duration: 3306.40 ms    Billed Duration: 3307 ms    Memory Size: 128 MB Max Memory Used: 88 MB  Init Duration: 335.79 ms

不过,我需要一份字典的清单。

myList = [{'Key': 'Name1', 'Value': 'Instance-1'}, {'Key': 'Name2', 'Value': 'Instance-2'}, {'Key': 'Name3', 'Value': 'Instance-3'}]

因为代码的其余部分如下所示

instance_id = event['detail']['instance-id']
response = ec2_client.create_tags(
  Resources=[
      instance_id,
    ],
  Tags=[
        {
            'Key': 'Name',
            'Value': 'event_bridge_lambda_tag'
        },
    ]
)

目前,我的lambda代码如下所示

import csv
import boto3
from collections import OrderedDict

def lambda_handler(event, context):
    
    s3_client = boto3.client("s3")
    ec2_client = boto3.client("ec2")

    S3_BUCKET_NAME = "tag-holds-bucket"
    FILE_NAME = "tags.csv"

    s3_file = s3_client.get_object(Bucket=S3_BUCKET_NAME, Key=FILE_NAME)
    file_content = s3_file['Body'].read().decode('utf-8').splitlines()
    
    myList = list()

    records = csv.DictReader(file_content)
    for row in records:
       #print(dict(row))
       myList.append(row)

myList.append(row)-〉给出了如下输出

START RequestId: 618217d1-d1da-473f-b55e-77f1f7fe52dc Version: $LATEST
[OrderedDict([('Key', 'Name1'), ('Value', 'Instance-1')]), OrderedDict([('Key', 'Name2'), ('Value', 'Instance-2')]), OrderedDict([('Key', 'Name3'), ('Value', 'Instance-3')])]
END RequestId: 618217d1-d1da-473f-b55e-77f1f7fe52dc
REPORT RequestId: 618217d1-d1da-473f-b55e-77f1f7fe52dc  Duration: 3128.39 ms    Billed Duration: 3129 ms    Memory Size: 128 MB Max Memory Used: 88 MB  Init Duration: 330.02 ms

我不知道怎么会变成这样

myList = [{'Key': 'Name1', 'Value': 'Instance-1'}, {'Key': 'Name2', 'Value': 'Instance-2'}, {'Key': 'Name3', 'Value': 'Instance-3'}]

我的cvs文件如下所示
tags.csv
和其余的lambda代码

instance_id = event['detail']['instance-id']
    response = ec2_client.create_tags(
    Resources=[
        instance_id,
    ],
    Tags=[
        {
            'Key': 'Name',
            'Value': 'event_bridge_lambda_tag'
        },
    ]
)
8ljdwjyq

8ljdwjyq1#

csv.DictReader返回dictOrderedDict,这取决于您运行的Python版本。
如文档所示:
版本3.6中的变更:返回的行现在属于OrderedDict类型。
版本3.8中的变更:返回的行现在是dict类型。
看起来你是在lambda函数中运行Python〈3.8,所以你有两种可能将输出作为dict:
1.将lambda函数运行时更改为更高的运行时
1.只需使用dict方法在代码中将OrderedDict转换为dictmy_dict = dict(myList)

omtl5h9j

omtl5h9j2#

collections.OrderedDict序列化为字典列表的一种方法是使用json库。

import json

# ...

records = csv.DictReader(file_content)
for row in records:
    myList.append(row)
myList = json.loads(json.dumps(myList)) # add this line

或者你可以直接使用列表解析

myList = [dict(item) for item in myList] # add this line

相关问题