如何从首行为键的垂直对齐文本文件提取键值对并生成字典列表?
考勤CSV数据转字典列表问题解决
问题场景
有一份从Excel复制得到的CSV格式考勤文本文件,内容示例:
Sr No,Employee ID,Name,Department,DOJ,1-Apr,2-Apr,3-Apr,4-Apr,5-Apr...31-Apr 1,ID001,Jason Smith,IT,01-Sep-22,WO,WO,P,P,P.... 2,ID002,Pearson Smith,IT,01-Sep-22,WO,P,P,WO,P....
其中WO、P代表每日考勤状态。需要将文件内容转换为字典列表:
- 首行表头作为字典的键
- 后续每行数据对应一个字典,值与表头一一匹配
示例字典:
{'Sr No':'1','Employee ID':'ID001','Name':'Jason Smith','Department':'IT','DOJ':'01-Sep-22','1-Apr':'WO','2-Apr':'WO','3-Apr':'P'....}
用户尝试用字典推导式实现,但代码导致所有键被赋值为同一个值,错误代码如下:
input_data = [] with open(r'file_path','r') as input_file: for line in input_file: input_data.append(line.strip('\n')) attendance_dict = {key: None for key in input_data[0].split(',')} for line in input_data[1:-1]: attendance_dict = {k:v for k in attendance_dict for v in line.split(",")}
错误原因
错误出在字典推导式的逻辑:{k:v for k in attendance_dict for v in line.split(",")} 是双层循环,会遍历所有键和所有值的组合,最终每个键都会被最后一个值覆盖,导致所有键的取值一致。
正确实现方案
方法1:用zip配对键值(直观易读)
attendance_list = [] with open(r'file_path', 'r') as input_file: # 读取并处理表头 headers = input_file.readline().strip('\n').split(',') # 遍历每行数据生成字典 for line in input_file: values = line.strip('\n').split(',') # 用zip将表头与值一一对应,转换为字典 row_dict = dict(zip(headers, values)) attendance_list.append(row_dict)
方法2:列表推导式简化写法
with open(r'file_path', 'r') as input_file: headers = input_file.readline().strip().split(',') # 用列表推导式一次性生成字典列表,跳过空行 attendance_list = [dict(zip(headers, line.strip().split(','))) for line in input_file if line.strip()]
执行后,attendance_list即为所需的字典列表,每个元素对应一行考勤数据。
内容的提问来源于stack exchange,提问作者Parikshit
相关产品推荐
相关产品推荐

