Python循环处理多Excel文件删指定列时报列不存在于轴的KeyError错误
核心问题定位
- 循环逻辑缩进错误:当前代码中
df2.to_excel写在for循环外部,所有文件处理完成后,只会把最后一次循环读取的文件结果保存下来,前面所有文件的处理结果都会被覆盖,不存在逐文件保存的逻辑 - 列名匹配逻辑矛盾:报错栈中可见你曾添加了将列名中
.替换为-的转换逻辑,但执行删除操作时,传入drop方法的目标列名仍保留原.格式,和转换后的实际列名完全不匹配,自然会触发列找不到的报错 - 无异常兼容逻辑:pandas的drop方法默认在待删除列不存在于当前表格时,会直接抛出KeyError终止程序。你测试单个文件时刚好遇到的是带目标列的文件,循环到列结构不同的文件时就会直接报错
- 未过滤临时文件:路径下如果存在Excel打开时生成的
~$开头的临时锁文件,也会被glob匹配到,这类文件读取本身就容易触发异常
修正后可正常运行的代码
import os import pandas as pd from pathlib import Path # 指定处理文件夹路径 folder_path = Path(r"C:\Users\kc\Documents\Extracted") # 预先定义需要删除的目标列 target_drop_list = [ 'BarrierFreeAttributes.BarrierFreeAttribute', 'ConsultationHours.ConsultationHoursTimeSpan', 'Location.Coordinates.Latitude_right', 'Location.Coordinates.Longitude_right' ] for excel_file in folder_path.glob('*.xlsx'): # 跳过Excel生成的临时锁文件 if excel_file.name.startswith('~$'): continue # 读取当前文件 df = pd.read_excel(excel_file) # 筛选出当前文件中实际存在的待删除列,不存在的列自动跳过 exist_drop_cols = [col for col in target_drop_list if col in df.columns] df_processed = df.drop(columns=exist_drop_cols, axis=1) # 处理完成后逐文件保存,输出为带前缀的新文件,避免覆盖原始数据 output_file = folder_path / f"processed_{excel_file.name}" df_processed.to_excel(output_file, index=False)
如果保留之前“将列名中.替换为-”的逻辑,需要同步把target_drop_list里的列名替换为对应格式,比如把BarrierFreeAttributes.BarrierFreeAttribute改成BarrierFreeAttributes-BarrierFreeAttribute,保证列名匹配规则一致。
操作注意事项
- 不要直接将处理结果覆盖回原文件路径,优先输出带有区分前缀的新文件,避免处理异常时造成原始数据不可逆的损坏
- 遇到同类列找不到报错时,可以先执行
print(df.columns.tolist())打印当前文件的实际列名,和目标列做逐字比对,快速排查列名拼写不一致、分隔符不匹配这类问题 - 如果文件列结构差异极大,建议在处理前先打印每个文件的列名清单,明确统一的列匹配规则后再批量处理
内容的提问来源于stack exchange,提问作者ChKYu
相关产品推荐
相关产品推荐

