Pandas代码在for循环内报错,循环外正常运行求排查
问题分析与解决方案
错误原因
- df变量被覆盖导致header获取错误:循环内你用
df = pd.read_excel(...)覆盖了初始的df,第二次循环时,df.index[df.iloc[:,0]=='Upload Flag']是基于已经处理过的df(而非原始工作簿)查找行,这会导致读取到的sheet列名可能包含非字符串类型(比如数值、NaN),而re.match只能处理字符串,因此抛出TypeError。 - 循环未使用遍历的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
相关产品推荐
相关产品推荐

