按文件名批量处理多文件时触发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
相关产品推荐
相关产品推荐

