Pandas无法打开Excel(.xlsx)文件。

171

请看下面的代码:

import pandas
df = pandas.read_excel('cat.xlsx')

运行后,它给我以下错误:

Traceback (most recent call last):
  File "d:\OneDrive\桌面\practice.py", line 4, in <module>
    df = pandas.read_excel('cat.xlsx')
  File "D:\python\lib\site-packages\pandas\util\_decorators.py", line 296, in wrapper
    return func(*args, **kwargs)
  File "D:\python\lib\site-packages\pandas\io\excel\_base.py", line 304, in read_excel
    io = ExcelFile(io, engine=engine)
  File "D:\python\lib\site-packages\pandas\io\excel\_base.py", line 867, in __init__
    self._reader = self._engines[engine](self._io)
  File "D:\python\lib\site-packages\pandas\io\excel\_xlrd.py", line 22, in __init__
    super().__init__(filepath_or_buffer)
  File "D:\python\lib\site-packages\pandas\io\excel\_base.py", line 353, in __init__
    self.book = self.load_workbook(filepath_or_buffer)
  File "D:\python\lib\site-packages\pandas\io\excel\_xlrd.py", line 37, in load_workbook
    return open_workbook(filepath_or_buffer)
  File "D:\python\lib\site-packages\xlrd\__init__.py", line 170, in open_workbook
    raise XLRDError(FILE_FORMAT_DESCRIPTIONS[file_format]+'; not supported')
xlrd.biffh.XLRDError: Excel xlsx file; not supported

我已尝试使用pip命令卸载并重新安装Pandas,但错误仍然存在。我已安装xlrd 2.0.1和Pandas 1.1.5。


1
@LNQ,你能否将你使用的命令添加到问题中。还需要你的pandas版本和xlrd版本,请执行pip freeze | findstr pandaspip freeze | findstr xlrd。预计你正在使用Python3。 - รยקคгรђשค
4
请阅读 https://pypi.org/project/xlrd/ 上的警告。我认为他们不再支持除 xls 格式以外的任何内容。您可以使用其他引擎,比如 openpyxl - รยקคгรђשค
2
@รยקคгรђשค 噢,谢谢。我重新安装了较旧的xlrd版本,现在它可以工作了。 - LNQ
3
在我的情况下,将 pandas 升级到 1.2.0 版本解决了问题(我使用的是 xlrd 2.0.1)。 - jjrr
5个回答

264

发布电子邮件中所述,该电子邮件链接自发布推文,并在文档的主页上出现了一个大型橙色警告标志,在repo的自述文件pypi的发布版本中也有类似的内容:

xlrd明确删除了对除xls文件以外格式的支持。

这是由于使用版本1.2或更早的xlrd读取.xlsx文件可能存在安全漏洞的原因。

在您的情况下,解决方法是:

  • 确保您使用最新版本的pandas,至少为1.0.1,并最好使用最新版本。
  • 安装openpyxl: https://openpyxl.readthedocs.io/en/stable/
  • 将您的pandas代码更改为:
  • pandas.read_excel('cat.xlsx', engine='openpyxl')
    

编辑:目前,pandas>=1.2已经解决了这个问题。(请查看发布说明)


79
这是一个反面教材,说明版本更新应该避免的方式。这次变更破坏了很多现有代码,并且我不记得用 xlrd 读取 xlsx 文件时曾经看到过弃用警告。如果我是你,我会快速发布一个新版本,支持 xlsx 文件,并给出非常清晰的弃用警告,说明下个版本将不再支持它。这将为人们提供时间来修复他们的系统,以避免遭受损失。人们通常不会阅读软件包自述文件或关注读取 excel 文件的软件包的推文。这不是通知他们的正确方式。 - zmbq
8
整个库已经出现了超过一年的弃用警告,而且四年前就有了这方面的公告。阅读文档和邮件列表公告对于这种问题非常重要。所需的更改很小,在考虑到潜在的安全漏洞时尤其如此。 - Chris Withers
9
@ChrisWithers,非常抱歉并感谢您所有的辛勤工作。请理解您的库主要用作依赖项,我们不会搜寻每个依赖项的页面,这就是为什么您的信息的可见性很低的原因。我们可以简单地将 engine="openpyxl" 传递给 pd.ExcelFile,但您的库以不同的方式解析Excel文件,代码编写考虑到了这一点,这意味着修复不是微不足道的。警告应该在代码装饰器中。我希望我知道,但我不知道。再次感谢您的工作。我会支持您的。 - nurettin
1
@ChrisWithers 我点击了所有上面的链接,但没有找到安全风险的解释。只有建议说“xlrd在Python 3.9中变得不可靠”。这似乎表明我可以在Python 3.7中继续使用它一段时间。虽然我创建大多数读取的文件,但我很想知道安全风险的性质。 - adr
5
openpyxl有很多怪癖,使用起来非常痛苦。如果Excel文件中的DateTime列宽度不够,Excel将输出替换为“XXXX”模板,并且openpyxl会尝试返回模板对象而不是数据,这会导致程序崩溃。这只是我在使用openpyxl时发现的众多问题之一...除了手动修改文件外,没有其他解决方案,但对于大型数据来说,这是一个大忌。 - Florian Fasmeyer

74

xlrd的最新版本(2.0.1)只支持.xls文件。

如果你准备冒安全漏洞和某些文件被错误解析的风险,可以通过安装较旧的xlrd版本来解决此错误。

在shell或cmd提示符中使用以下命令:

pip install xlrd==1.2.0

62
拥有一个不支持Excel文件的Excel模块,真是非常有用。 - pianoman102
4
也许你可以阅读README文件、软件包的发布说明或者发布邮件来了解原因?我可以帮助你翻译这句话,但不能提供其他信息。 - Chris Withers
30
作为该软件包的作者,我想要明确一点:这是一个极其危险的建议。xlsx支持被移除的原因是它存在潜在的安全漏洞,并且没有人在维护它。如果您选择这种方法而不是轻松切换到openpyxl,那么您将冒着受到这些漏洞威胁的风险。 - Chris Withers
6
很遗憾,openpyxl似乎根本无法处理我正在处理的Excel文件。它完全不能解析,并且始终返回一个空数据框。 - user3756718
4
回到 xlrd==1.2.0 版本可以解决问题。谢谢。 - Moosa Sharieff
显示剩余4条评论

2

最新版本的Pandas支持xlsx文件。我在1.1.4版本上遇到了这个错误,升级到1.3.5版本后问题得到解决。

pip install --upgrade pandas

我不再遇到XLRDError错误。旧版本也支持xlsx文件。


1
最好的方法可能是让openpyxl成为read_excel()的默认读取器,以防旧代码因此更新而出现故障。
您可以通过进入环境下的pandas文件夹中的_base.py来更改该方法的默认值来实现。您可以按以下方式找到它:
import pandas as pd
print(pd.__file__)

打开文件并查找。
def read_excel(...)

您会发现引擎的默认值。将其更改为“openpyxl”。
原始提示/答案在这里:https://stackoverflow.com/a/69577391/7151338

1

我在使用ExcelFile构造函数(用于包含多个工作表的文件)时遇到了同样的问题,而不是使用read_excel方法。在这种情况下,解决方案是:

import pandas

xlsx = pandas.ExcelFile('cat.xlsx', engine='openpyxl')

请问您是否可以提供更多细节,而不仅仅是发布如何导入和打开文件的内容?我有错吗? - Maf
2
答案告诉你engine参数也可以在构造函数ExcelFile(…)中设置,而不仅仅是在read_excel方法中。我花了一些时间才弄清楚这一点,所以我把它作为答案添加在这里,供那些使用构造函数读取xlsx文件而不是xls文件的人参考。 - avandeursen
1
你的答案很好。抱歉,我以前不是很熟悉这个。 - Maf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接