使用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
相关产品推荐
相关产品推荐

