如何在Python中加载最初具有.xls文件扩展名的xlsx?

Pyd*_*man 6 python xlrd excel-2010 python-2.7 openpyxl

我正在使用xlrd处理.xls文件,并openpyxl处理.xlsx文件,这很好用.

然后我交给了表面上是.xls文件的东西,所以我尝试着xlrd.open_workbook(),得到:

XLRDError: Unsupported format, or corrupt file: Expected BOF record; found '<?xml ve'
Run Code Online (Sandbox Code Playgroud)

我看一下这个问题,我猜测我的文件虽然以扩展名.xls结尾,但实际上必须是.xlsx.事实上,我可以在文本编辑器中查看它:

<?xml version="1.0" encoding="UTF-8"?>
                      <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
                       xmlns:x="urn:schemas-microsoft-com:office:excel"
                       xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
                       xmlns:html="http://www.w3.org/TR/REC-html40">
:
:
:
Run Code Online (Sandbox Code Playgroud)

(出于隐私原因,我无法发布整个文件,但我们的分析可能不需要).

所以我猜测,如果我只是将cp它复制(.)到.xlsx,我应该可以打开它openpyxl.load_workbook(),但我得到:

BadZipfile: File is not a zip file
Run Code Online (Sandbox Code Playgroud)

如果它实际上是一个xls(不太可能)但是无法打开xlrd,并且如果它是一个非常的xlsx但是无法打开openpyxl,即使我将cp它转换为.xlsx,该怎么办?

注意:如果我在Excel中打开.xls,将其保存为.xlsx,然后重试openpyxl,它确实可以正常加载,但是这个手动步骤并不是我执行程序时的奢侈.

Zen*_*dix 8

有一件事是清楚的:您尝试打开的文件格式与其扩展程序建议的格式不同.

如您所知,Excel文件格式包括(但不限于)xlsxlsx.

  • Excel 2003格式(xls)是二进制格式.这意味着如果您xls使用文本编辑器打开文件,您只会看到乱码.

  • Excel 2007格式(xlsx)完全不同.一个xlsx文件是一堆内部的XML文件的zip文件.您可以使用zip存档来提取xlsx文件的内容.然后,您可以使用任何文本编辑器编辑XML文件.但是,xlsx使用文本编辑器直接打开文件就像用文本编辑器打开zip文件一样:你只会看到乱码.

可以使用文本编辑器打开文件(并读取其内容)这一事实表明它既不是xls文件也不是xlsx文件.您的文件既不是二进制文件也不是zip文件,它是一个普通的 XML文件.

此外,此错误消息说了很多.

BadZipfile: File is not a zip file
Run Code Online (Sandbox Code Playgroud)

这意味着openpyxl尝试将文件作为xlsx文件打开,因此也就是zip文件.但是当它试图提取其内容时,它会失败,因为你的文件甚至不是一个zip文件.

但如果文件既不是xlsx文件也不是xls文件,Microsoft Excel如何读取它?我也想知道.经过一些研究,我相信您的文件具有XML Spreadsheet 2003文件格式.此示例与您发布的文件内容非常相似.由于Microsoft Excel支持这种格式,因此难怪它可以读取您的文件.

不幸的是,Python库如xlrdopenpyxl仅支持xlsxlsx文件格式,因此他们将无法阅读您的文件.我想你只需要手动将其转换为支持的格式.