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

时间:2015-07-03 17:51:13

标签: python python-2.7 excel-2010 xlrd openpyxl

我使用xlrd处理.xls文件,openpyxl处理.xlsx文件,这样做效果很好。

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

XLRDError: Unsupported format, or corrupt file: Expected BOF record; found '<?xml ve'

我看一下this问题,我推测我的文件虽然以扩展名.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">
:
:
:

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

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

BadZipfile: File is not a zip file

如果它实际上是xls(不太可能),但无法使用xlrd打开,如果它实际上是xlsx,但无法使用{{1}打开即使在我openpyxl到.xlsx之后,该怎么办?

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

3 个答案:

答案 0 :(得分:8)

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

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

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

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

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

此外,此错误消息说明了很多。

BadZipfile: File is not a zip file

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

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

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

答案 1 :(得分:3)

我不在OSX上,因此未经过测试。您可以使用endsWith软件包,尽管它没有支持,打开有问题的文件并重新保存它。

appscript

答案 2 :(得分:0)

我有类似的问题。事实证明它需要绝对文件路径。例如,“c:/dir/filename.xlsx”而不是“filename.xlsx”。相对路径适用于osx,但不适用于Windows。