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

读取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:03:43