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

Pandas代码在for循环内报错,循环外正常运行求排查

问题分析与解决方案

错误原因

  1. df变量被覆盖导致header获取错误:循环内你用df = pd.read_excel(...)覆盖了初始的df,第二次循环时,df.index[df.iloc[:,0]=='Upload Flag']是基于已经处理过的df(而非原始工作簿)查找行,这会导致读取到的sheet列名可能包含非字符串类型(比如数值、NaN),而re.match只能处理字符串,因此抛出TypeError。
  2. 循环未使用遍历的sheet变量:你遍历testdf.sheet_names但每次都固定读取'OPSI',既不符合遍历逻辑,也会导致重复处理同一sheet时出现异常。

修正后的代码

import pandas as pd
import os
import re

wb = 'data/KSA STRATEGY OPSI.xlsx'

# 先单独读取工作簿,获取header行位置,避免循环内覆盖原始数据
with pd.ExcelFile(wb) as xls:
    # 获取'OPSI' sheet的header行(若要处理所有sheet,需调整逻辑)
    initial_df = pd.read_excel(xls, sheet_name='OPSI', header=None)
    header_row = initial_df.index[initial_df.iloc[:,0]=='Upload Flag'].tolist()[0]
    
    # 遍历所有sheet
    for sheet in xls.sheet_names:
        # 读取当前sheet,使用正确的header行
        df = pd.read_excel(xls, sheet_name=sheet, header=header_row)
        columns_list = list(df.columns)
        
        # 先确保列名是字符串,再做正则匹配
        r = re.compile(r"[A-Za-z]{3}-[0-9]{2}-Q")
        columns_list = [col for col in columns_list if isinstance(col, str) and r.match(col)]
        
        columns_list.insert(0, "Item_code")
        columns_list.insert(1, "Type")
        
        # 后续可添加对columns_list的业务处理
        print(f"处理sheet {sheet} 完成,筛选后列:{columns_list}")

关键修改点

  • 用pd.ExcelFile上下文管理器统一读取工作簿,避免重复打开文件。
  • 提前获取header行位置,不依赖循环内被覆盖的df变量。
  • 过滤列名时先判断是否为字符串类型,再执行正则匹配,规避非字符串元素报错。
  • 循环中使用遍历的sheet变量读取对应sheet,符合遍历逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 12:50:23