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

使用Polars的calamine/fastexcel引擎调用pl.read_excel()时如何处理#DIV/0!错误?

使用Polars的calamine/fastexcel引擎调用pl.read_excel()时如何处理#DIV/0!错误?

我太懂这种无奈了——明明只需要特定几列,结果引擎因为完全无关的列报错卡壳!问题的核心原因是:calamine/fastexcel引擎在解析你指定的列名时,需要先扫描整个工作表的结构(包括所有列的元数据和部分单元格)来确认列的位置与数据类型,哪怕你只需要其中几列。这就导致它会碰到那些你根本不需要的错误单元格(比如#DIV/0!)和未命名列,触发数据类型推断失败的报错。

下面给你几个可行的解决方案,按操作复杂度从易到难排序:

方案一:忽略单元格错误,读取全表后再选列

这是最快速的临时解决办法:先让引擎跳过单元格错误,成功读取整个工作表后,再筛选出你需要的列。虽然会读取全表,但至少能拿到目标数据:

import polars as pl

df = pl.read_excel(
    source=xlsx_file_path,
    sheet_name="name_of_the_sheet",
    read_options={
        "ignore_errors": True,  # 跳过#DIV/0!这类单元格计算错误
    }
).select(["apple_column", "banana_column", "kiwi_column"])

方案二:强制指定有问题列的数据类型

如果你能确定报错的列(比如__UNNAMED__25),可以通过dtype_overrides强制指定它的数据类型,让引擎能完成数据类型推断,同时保留你需要的列:

df = pl.read_excel(
    source=xlsx_file_path,
    sheet_name="name_of_the_sheet",
    dtype_overrides={"__UNNAMED__25": pl.Utf8},  # 把有问题的列强制设为字符串类型
    columns=["apple_column", "banana_column", "kiwi_column"],
)

注意:如果这个未命名列的编号(比如__UNNAMED__26)会随文件变化,这个方法就需要手动调整。

方案三:通过列索引精准读取目标列

如果能确定你需要的列在工作表中的位置,直接用列索引指定读取的列,引擎会只读取这些列的单元格,完全不会触碰有错误的无关列。

首先,先读取工作表的列名行,获取目标列的索引:

# 只读取0行,快速获取所有列名
column_names = pl.read_excel(
    source=xlsx_file_path,
    sheet_name="name_of_the_sheet",
    n_rows=0,
).columns

# 匹配目标列对应的索引
target_col_indices = [column_names.index(col) for col in ["apple_column", "banana_column", "kiwi_column"]]

然后用索引指定要读取的列:

df = pl.read_excel(
    source=xlsx_file_path,
    sheet_name="name_of_the_sheet",
    read_options={
        "use_columns": target_col_indices,
    }
)

这个方法是最彻底的,因为引擎只会处理你指定索引的列,完全不会接触到那些有错误的无关列。

备注:内容来源于stack exchange,提问作者miroslaavi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 14:38:04