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

读取xlsm文件后列显示在df.columns中但引用时报KeyError如何解决

异常原因
  • 列名包含肉眼不可见的特殊字符:xlsm格式文件的表头经常会从Excel中附带非间断空格(\xa0)、全角空格、零宽空格、非打印控制字符等特殊字符,你当前仅使用str.strip()做处理,部分特殊字符无法被完全清理。pandas打印列名时会自动隐藏不可见字符,导致视觉上列名匹配,实际字符完全不一致。
  • 列名校验逻辑缺失:你贴出的文件2运行输出仅包含列名打印结果,没有4个in判断的返回值,实际该判断在文件2运行时全部返回False,列名从始至终就没有匹配成功。
解决方案
  1. 先对列名做彻底的特殊字符清理,替换所有空白类字符为普通半角空格后再去首尾空格,替换原有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()
  1. 若清理后仍报错,可通过repr()打印列名的原始字符,排查隐藏的特殊字符:
target_cols = ['Service Office', 'Unique Number', 'Email Filename', 'Invoice Filename']
for col in df_Client.columns:
    print(f"列名原始值:{repr(col)},长度:{len(col)}")
  1. 若不同文件的列名存在微小差异,可使用模糊匹配方式取列,避免精准匹配失败:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 18:09:03