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

2024-06-13 21:43:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我用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">
:
:
:

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

所以我推测如果我把它复制到一个.xlsx上,我应该可以用openpyxl.load_workbook()打开它,但是我得到:

BadZipfile: File is not a zip file

如果它实际上是一个xls(不太可能),但不能用xlrd打开,如果它实际上是一个xlsx,但不能用openpyxl打开,即使在Icp到一个.xlsx之后,该怎么办?

注意:如果我在Excel中打开.xls,将其另存为.xlsx,然后用openpyxl重试,它确实可以很好地加载,但这一手动步骤不是我在执行程序时所能拥有的奢侈。


Tags: 文件comxmlxlsxxlsschemasmicrosoftfile
3条回答

我不在OSX上,所以这不是测试。尽管缺少支持,您仍然可以使用appscript包来打开有问题的文件并重新保存它。

from appscript import *
excel = app('Microsoft Excel')
wb = excel.open('/path/to/file.xls')
wb.save_as('/path/to/fileout.xlsx', file_format=k.XLSX_file_format)
#not sure the exact name of k.excel_file

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

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

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

  • Excel 2003格式(xls)是二进制格式。这意味着,如果用文本编辑器打开xls文件,就会看到乱七八糟的内容。

  • Excel 2007格式(xlsx)完全不同。xlsx文件是一个zip文件,其中包含一堆XML文件。您可以使用zip archiver来提取xlsx文件的内容。然后,可以使用任何文本编辑器编辑XML文件。然而,直接用文本编辑器打开一个xlsx文件就像用文本编辑器打开一个zip文件:你会看到一些乱七八糟的东西。

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

而且,这个错误信息说明了很多。

BadZipfile: File is not a zip file

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

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

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

相关问题 更多 >