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

按文件名批量处理多文件时触发KeyError: '20200909'求助

解决代码中的KeyError: '20200909'问题

问题原因分析

你遇到的KeyError: '20200909'是因为这个日期在你的文件系统中不存在对应的3个文件,导致代码没有将它添加到data_per_date字典中,但后续遍历missing_dates列表时,仍然尝试访问这个不存在的键。

具体看你的代码逻辑:

  • 当处理missing_date时,如果通过glob找到的文件数量不等于3(比如20200909没有任何文件,数量为0),代码会执行continue跳过当前日期的处理,不会将该日期写入data_per_date字典。
  • 但最后一段代码是直接遍历missing_dates列表,尝试访问data_per_date[date],这就会对没有被处理的日期抛出KeyError。

另外,你的代码还有一个隐藏问题:vehicle_loc_dict没有在每个日期循环内初始化,这会导致不同日期的数据被混存在同一个字典里,最终输出的结果会包含之前日期的旧数据。

修复方案

1. 只处理成功收集到3个文件的日期

把最后遍历missing_dates的逻辑,改成遍历data_per_date的键(也就是那些成功收集到3个文件的日期),这样就不会访问不存在的键:

# 替换原有的最后一段循环
for date in data_per_date:  # 只处理已成功收集数据的日期
    file_name = "MM{}-AB.dat".format(date)
    full_path = os.path.join(my_files, 'Directory_X', file_name)
    with open(full_path, 'w+') as output:
        writer = csv.writer(output, delimiter='\t')
        writer.writerow(headers)
        # 注意:原代码中的writer.writerow(data)这里的data未定义,需要确认用途后调整
        vehicle_loc = data_per_date[date]
        for vehicle_loc_list in vehicle_loc.values():
            for record_group in group_records(vehicle_loc_list):
                writer.writerow(output_record(record_group))

2. 初始化每个日期的字典

在处理每个missing_date的循环内,重新初始化vehicle_loc_dict,避免数据污染:

for missing_date in missing_dates:
    print(f"processing {missing_date}")
    vehicle_loc_dict = {}  # 每个日期都创建新的字典,避免跨日期数据混存
    files=[fn for fn in (e for e in root.glob(f"**/*_{missing_date}.txt") if e.is_file())]
    if len(files) != 3: # stop processing, check other date
        continue
    # 后续的文件读取逻辑不变...

额外提示

  • 可以在跳过日期时增加日志提示,方便排查:print(f"Skipping {missing_date}: Found {len(files)} files instead of 3")
  • 原代码中writer.writerow(data)这一行的data变量没有定义,需要确认它的用途后补充定义或删除该行,否则会触发新的NameError。

内容的提问来源于stack exchange,提问作者TangerCity

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:50:31