Python中将字典数据赋值给类和对象时出现KeyError问题如何解决
报错诱因
- 字典结构理解错误:你生成的
data2是两层嵌套结构,第一层的键是Austin、keller这类用户名,第二层才是姓名、联系方式等属性字段。你直接用values[2](也就是姓名值)作为第一层键去查data2,自然找不到对应键,触发KeyError。 - 类使用逻辑错误:你直接给
member2类本身的属性赋值,没有创建类的实例,后续如果存储多个用户数据会直接覆盖,不符合业务逻辑。 - 代码执行顺序错误:赋值操作写在了
data2的生成逻辑之前,即使键写对也会出现变量未定义或取值错误的问题。 - 隐式变量未定义:代码中用到的
keys变量没有提前定义,生成属性字典时会出现键值不匹配的问题。
修复方案
第一步:提前定义字段映射关系
先明确文本字段和类初始化参数的对应关系,避免后续取值混乱:
# 文本拆分后对应的字段名,和values的位置一一对应 text_keys = ["placeholder", "Full Name", "Contact Details", "Emergency Contact Number", "Country"] # 字段名和类初始化参数的映射 field_map = { "Full Name": "realname", "Contact Details": "phone", "Emergency Contact Number": "emergencyContact", "Country": "country" }
第二步:调整读取和实例化逻辑
按正确顺序读取文件、生成属性字典、创建类实例存储:
class Member: # 类名建议遵循PEP8规范用大驼峰,也可以保留原来的member2 def __init__(self, realname, phone, emergencyContact, country): self.realname = realname self.phone = phone self.emergencyContact = emergencyContact self.country = country # 存储所有成员实例的字典,键为用户名 member_dict = {} with open("something.txt", 'r') as f: for line in f: line = line.strip() if not line: # 跳过空行 continue # 拆分每行数据 username, values_str = line.split(" = ") values = values_str.split('|') # 生成当前用户的属性字典 attr_dict = dict(zip(text_keys, values)) # 筛选类初始化需要的参数 init_params = {field_map[k]: attr_dict[k] for k in field_map} # 创建类实例存入字典 member_dict[username] = Member(**init_params) # 测试取值,比如获取Austin的姓名 if "Austin" in member_dict: print(member_dict["Austin"].realname) # 输出 Stone Cold Austin print(member_dict["Austin"].phone) # 输出 996003892
原错误行的快速修复
如果你只需要修改原报错的那一行,只需要调整取值逻辑即可:
# 原错误代码:member2.realname = data2[values[2]] # 修复后,先取第一层用户名对应的属性字典,再取姓名字段 austin_attr = data2["Austin"] realname = austin_attr["Full Name"] # 创建实例后再赋值 austin_member = member2(realname, austin_attr["Contact Details"], austin_attr["Emergency Contact Number"], austin_attr["Country"])
内容的提问来源于stack exchange,提问作者Gaming Editor
相关产品推荐
相关产品推荐

