You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从首行为键的垂直对齐文本文件提取键值对并生成字典列表?

考勤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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 02:00:18