Python:Pandas read_excel 无法打开 .xls 文件,不支持 xlrd

Posted

技术标签:

【中文标题】Python:Pandas read_excel 无法打开 .xls 文件,不支持 xlrd【英文标题】:Python: Pandas read_excel cannot open .xls file, xlrd not supported 【发布时间】:2021-06-13 23:31:12 【问题描述】:

问题:

我正在使用 pd.read_excel 打开一个 .xls,但出现错误。 (“打包excel文件”下载自https://cima.aemps.es/cima/publico/nomenclator.html

df_cima = pd.read_excel("price_tracker/es/support/Presentaciones.xls")

xlrd.biffh.XLRDError: Excel xlsx file; not supported

这个文件的后缀是 .xls 但这个错误告诉我它是 .xlsx

然后我尝试添加engine="openpyxl",它通常用于当xlrd版本不再是1.2.0时读取.xlsx,然后又给我一个错误

openpyxl.utils.exceptions.InvalidFileException: openpyxl does not support the old .xls file format, please use xlrd to read this file, or convert it to the more recent .xlsx file format.

我的环境:

熊猫版本:1.1.5 xlrd 版本:2.0.1 openpyxl 版本:3.0.6

我不想将我的 xlrd 版本改回 1.2.0,从其他答案中我看到新版本的 xlrd 仅支持 .xls,但我不明白为什么不支持为我的文件工作。

提前致谢。

【问题讨论】:

你可以先把文件另存为 xlsx 吗? 然后通过在ms excel 或任何其他excel 编辑器/查看器中打开并将文件的扩展名从.xls 更改为.xlsx 并将其保存在同名但不同的相同位置/路径中扩展名即 ..xlsx @AnuragDabas 我每个月有多个这样的文件,我不会选择手动更改它,我们可以在使用脚本下载时直接将 .xls 更改为 .xlsx 吗? 我的 Python 是 3.8。那么您的情况必须是导致它的软件包的不同组合。但是,整理它会非常耗时。如果可以,请绕过它,例如通过你提到的直接下载 xlsx 文件或像我一样手动转换它。 @SeaBean,我先尝试了 pandas-1.2.1 和 xlrd-2.0.1,然后是 pandas-1.1.5 和 xlrd-2.0.1,当我切换环境时,pycharm 控制台没有更新。所以我只是再次尝试了这两个组合(pandas-1.2.1和xlrd-2.0.1 vs pandas-1.1.5和xlrd-2.0.1),这次确实是pandas-1.2 .1和xlrd-2.0.1效果很好不是pandas-1.1.5和xlrd-2.0.1,我认为pandas-1.1的组合肯定有一个未解决的问题.5 和 xlrd-2.0.1,我明天在办公室再试一次 【参考方案1】:

您的文件不是 .xls,我坚持! :)

使用 Pandas 1.1.5 和 xlrd 2.1.0

Presentaciones.xls 重命名为Presentaciones.xlsx

import pandas as pd
# Use openpyxl.
df = pd.read_excel(r'X:...\Presentaciones.xlsx', engine='openpyxl')
print(df)

享受吧! :)

更多信息

我怎么知道你的文件是假的.xls 和非常真实的.xlsx? 因为openpyxl 不适用于xls 文件。

import pandas as pd
df = pd.read_excel(r'X:...\test.xls', engine='openpyxl')
/* 
   ERROR:
   InvalidFileException: openpyxl does not support the old .xls file format, 
   please use xlrd to read this file, or convert it to the more recent .xlsx file format.
*/

尝试简单地将 test.xls 重命名为 test.xlsx 也不起作用!

import pandas as pd
df = pd.read_excel(r'X:...\test.xlsx', engine='openpyxl')
/*
    Error:
    OSError: File contains no valid workbook part
*/

历史

请注意,.xlsx 扩展名(由 pandas 检测到)意味着此文件中可能存在脚本。有时扩展程序可能会撒谎,所以小心

panda 停止支持xlsx 文件的原因是这些文件存在安全隐患,没有人维护这部分代码。

【讨论】:

嗨,非常感谢。然后我想知道为什么当我将 pandas 从 1.1.5 更新到 pandas-1.2.1 时 pd.read_excel(r'X:...\test.xls') 会起作用?如果我假设这个文件是不是.xls,当我没有指定引擎时,它默认是'xlrd',这意味着在这个版本下这个文件可以用xlrd读取,但xlrd只支持.xls,那么这个文件因此是一个 xls,这违背了我的假设......? 从我昨天的记忆中。 read_excel() 根据检测到的文件选择引擎。所以通常你不应该精确引擎。也许较新版本的熊猫会自动检测文件类型,而不管文件名“.xls”中的扩展名是什么......或者我的直觉是正确的,因为所有错误的原因,我都错了。不管怎样,这很有趣。 xD

以上是关于Python:Pandas read_excel 无法打开 .xls 文件,不支持 xlrd的主要内容,如果未能解决你的问题,请参考以下文章

使用 pandas read_excel() 将 .xls 文件格式导入 python 时出现 CompDocError

请问在Pandas用read_excel函数读取数据

python pandas如何过滤剔除数据?

Python Pandas GroupBy

python学习-pandas

Python Pandas read_excel dtype str 在读取或通过 to_csv 写入时将 nan 替换为空白 ('')