读取Excel时处理空工作表/A1含"Empty"工作表的AttributeError异常
解决AttributeError: 'Series' object has no attribute 'iterrows'的问题
这个问题的核心原因很明确:你在pd.read_excel里用了squeeze=True参数,它会在读取到的表格只有一行、一列或者单个单元格时,自动把DataFrame压缩成Series。当工作表为空,或者仅A1单元格是"Empty"时,返回的结果就是Series,而Series并没有iterrows()方法,所以触发了这个错误。
下面给你两种可行的解决思路,你可以根据自己的需求选择:
方法一:移除squeeze=True(推荐)
直接去掉这个参数,让pd.read_excel始终返回DataFrame,这样就不用额外处理类型转换的问题,代码逻辑更清晰:
# 读取为DataFrame,不再自动压缩为Series df = pd.read_excel(excel_file, header=None, sheet_name=sheet_name) # 先处理特殊情况:空表 或 仅A1单元格是"Empty" if df.empty or (df.shape == (1, 1) and df.iloc[0, 0] == "Empty"): # 根据你的业务需求处理,比如初始化空的data,或者跳过当前工作表 data = pd.DataFrame() else: # 执行你原来的逻辑,此时df是DataFrame,iterrows()可以正常使用 for i, row in df.iterrows(): if row.notnull().all(): data = df.iloc[(i+1):].reset_index(drop=True) data.columns = pd.Series(list(df.iloc[i])).str.replace(' ', '_') break # 转换数值类型 for c in data.columns: data[c] = pd.to_numeric(data[c], errors='ignore')
方法二:保留squeeze=True,增加类型判断
如果你因为某些原因必须保留squeeze=True,可以在代码里先判断返回结果的类型,针对Series做特殊处理:
df = pd.read_excel(excel_file, header=None, squeeze=True, sheet_name=sheet_name) # 检查是否是Series类型 if isinstance(df, pd.Series): # 处理空表或仅A1为"Empty"的情况 if df.empty or (len(df) == 1 and df.iloc[0] == "Empty"): data = pd.DataFrame() else: # 将Series转换为DataFrame,继续后续逻辑 df = df.to_frame() for i, row in df.iterrows(): if row.notnull().all(): data = df.iloc[(i+1):].reset_index(drop=True) data.columns = pd.Series(list(df.iloc[i])).str.replace(' ', '_') break for c in data.columns: data[c] = pd.to_numeric(data[c], errors='ignore') else: # 处理正常的DataFrame情况 for i, row in df.iterrows(): if row.notnull().all(): data = df.iloc[(i+1):].reset_index(drop=True) data.columns = pd.Series(list(df.iloc[i])).str.replace(' ', '_') break for c in data.columns: data[c] = pd.to_numeric(data[c], errors='ignore')
补充说明
第一种方法更简洁,因为避免了类型转换的额外判断,推荐优先使用。另外,在处理特殊情况时,你可以根据实际业务需求调整逻辑,比如抛出自定义提示、跳过当前工作表,或者初始化符合要求的空数据结构。
内容的提问来源于stack exchange,提问作者Praveen Mandadi
相关产品推荐
相关产品推荐

