字典中的键错误,即使该键存在

key error in dictionary even though that key is present

提问人:Aum_Khorava 提问时间:7/27/2023 更新时间:7/27/2023 访问量:45

问:

我正在做的是链接字典。所以我已经链接了两个,但是当我尝试链接它时,代码抛出一个密钥错误。这是我构建的将csv文件转换为字典的功能。

def csv_read_to_dict(fl_name):
    file = open(fl_name,"r")
    data = csv.reader(file)
    data_list = list(data)
    
    final_list = []
    for value in range(1,len(data_list)):
        final_list.append(data_list[value])
        

    final_dict = {}
    for data in final_list:
        final_dict[data[0]] = {"SEM_4":{"Subject":{"OS":data[2],"OOP":data[3],"COA":data[4],"DM":data[5],"Management":data[6]}}}
    return final_dict

我所期望的是将 sem 3 和 4 结果添加到现有字典中。此图显示了 SEM 1 和 2

Python 字典 数据操作

评论

0赞 Martynas Žiemys 7/27/2023
打开文件,但不要关闭它。更好地使用它将为您关闭文件。with open(fl_name) as ... :
3赞 Martynas Žiemys 7/27/2023
我认为,如果您编辑了问题并包含了一个示例文件,或者发布了一些可能在文件中的示例内容,以便可以测试代码,您将有更好的机会获得帮助。

答:

0赞 Roronoa Zoro 7/27/2023 #1

Python 中的 update() 函数可用于链接字典。但是,根据您提供的函数,您似乎正在为 CSV 文件中的每一行创建一个新词典,而不是立即更新现有词典。若要解决此问题,必须首先确定现有字典中是否已存在键(例如,“SEM_4”)。如果是这样,您可以更改该值;否则,您可以创建新的键值对。

以下是函数的修订版本,包括第 3 学期和第 4 学期,结果链接在一起:

def csv_read_to_dict(fl_name, existing_dict=None):
    file = open(fl_name, "r")
    data = csv.reader(file)
    data_list = list(data)

    final_list = []
    for value in range(1, len(data_list)):
        final_list.append(data_list[value])

    if existing_dict is None:
        final_dict = {}
    else:
        final_dict = existing_dict

    for data in final_list:
        student_id = data[0]
        sem_4_data = {
            "SEM_4": {
                "Subject": {
                    "OS": data[2],
                    "OOP": data[3],
                    "COA": data[4],
                    "DM": data[5],
                    "Management": data[6]
                }
            }
        }

        if student_id in final_dict:
            if "SEM_4" in final_dict[student_id]:
                final_dict[student_id]["SEM_4"]["Subject"].update(sem_4_data["SEM_4"]["Subject"])
            else:
                final_dict[student_id].update(sem_4_data)
        else:
            final_dict[student_id] = sem_4_data

    return final_dict

您现在可以将现有词典(包括第 1 学期和第 2 学期的数据)作为“existing_dict”参数发送到此更新的函数,它会将第 3 学期和第 4 学期的数据集成到现有词典中。如果您没有现有的词典,请在不使用“existing_dict”选项的情况下运行该函数,它将生成一个新词典,其中包含第 3 学期和第 4 学期的数据。

谢谢。