Pandas读取excel时报错说文件格式不对,是什么原因?

读取 excel 时报如下的错:

Excel file format cannot be determined, you must specify an engine manually.

该怎么解?

原因

这个问题的原因在于 pandas 识别不了你的文件类型。

pandas 支持的文件头就这几种

    b"\x09\x00\x04\x00\x07\x00\x10\x00",  # BIFF2
    b"\x09\x02\x06\x00\x00\x00\x10\x00",  # BIFF3
    b"\x09\x04\x06\x00\x00\x00\x10\x00",  # BIFF4
    b"\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1",  # Compound File Binary
    b"PK\x03\x04" # xlsx

如果文件格式不是上面的任何一种,pandas 就会报错。

那是怎么知道 pandas 支持的文件格式就这几种的呢?答案在 pandas 的源码里。

分析

报错的地方,跟进去看代码。

报错的代码在这个文件里 .../pandas/io/excel/_base.py,具体在这个位置

我们看到,这里之所以报错,是因为 ext is None。那 ext 为什么是 None 呢?得看 ext 是怎么得到的。1376行 ext = inspect_excel_format(...),来看一下 inspect_excel_format 这个函数。

inspect_excel_format 这个函数里唯一可能返回的 None 的代码在这里

peak 是文件头,这里的意思是说如果 peak 不匹配 XLS_SIGNATURES 中的任何一个 pattern,也不匹配 ZIP_SIGNATURE,那就返回 None。

那再来看 XLS_SIGNATURES 和 ZIP_SIGNATURE 是什么

现在就很清楚了。

解法

这个报错的问题怎么解决呢?

excel 有很多种格式,同样是 xls 的后缀名,但文件可能是不同的格式,可以试试将 excel 保存其它 xls 格式,『另存为』里面有很多可选的格式。