读取 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 格式,『另存为』里面有很多可选的格式。