读取xlsm文件后列显示在df.columns中但引用时报KeyError如何解决
异常原因
- 列名包含肉眼不可见的特殊字符:xlsm格式文件的表头经常会从Excel中附带非间断空格(\xa0)、全角空格、零宽空格、非打印控制字符等特殊字符,你当前仅使用
str.strip()做处理,部分特殊字符无法被完全清理。pandas打印列名时会自动隐藏不可见字符,导致视觉上列名匹配,实际字符完全不一致。 - 列名校验逻辑缺失:你贴出的文件2运行输出仅包含列名打印结果,没有4个
in判断的返回值,实际该判断在文件2运行时全部返回False,列名从始至终就没有匹配成功。
解决方案
- 先对列名做彻底的特殊字符清理,替换所有空白类字符为普通半角空格后再去首尾空格,替换原有
df_Client.columns = df_Client.columns.str.strip()逻辑:
# 匹配所有Unicode空白字符,统一替换为单个半角空格后去除首尾空格 df_Client.columns = df_Client.columns.str.replace(r'\s+', ' ', regex=True).str.strip()
如果仍存在特殊字符,可以再加一层非合法字符过滤:
# 保留中文、英文、数字、空格、下划线,删除其余所有字符 df_Client.columns = df_Client.columns.str.replace(r'[^\u4e00-\u9fa5a-zA-Z0-9 _]', '', regex=True).str.strip()
- 若清理后仍报错,可通过
repr()打印列名的原始字符,排查隐藏的特殊字符:
target_cols = ['Service Office', 'Unique Number', 'Email Filename', 'Invoice Filename'] for col in df_Client.columns: print(f"列名原始值:{repr(col)},长度:{len(col)}")
- 若不同文件的列名存在微小差异,可使用模糊匹配方式取列,避免精准匹配失败:
def match_col(df, keyword): for col in df.columns: if keyword.strip() in col.strip(): return col raise KeyError(f"未找到包含关键字{keyword}的列") df_Client = df_Client[[ match_col(df_Client, 'Unique Number'), 'Entity', 'Creditor', 'Payment Description', 'Invoice Date', 'Invoice No.', 'Amount', 'Currency', 'Comments', 'Due Date', match_col(df_Client, 'Service Office'), match_col(df_Client, 'Email Filename'), match_col(df_Client, 'Invoice Filename') ]]
内容的提问来源于stack exchange,提问作者Arnab
相关产品推荐
相关产品推荐

