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

标签 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 但不能用 openpyxl 打开,即使在我将其cp 为 .xlsx 后,该怎么办?

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

最佳答案

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

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

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

  • Excel 2007 格式 (xlsx) 有很大不同。 xlsx 文件是一个 zip 文件,里面有一堆 XML 文件。您可以使用 zip 存档器来提取 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 format . This example看起来与您发布的文件内容非常相似。由于 Microsoft Excel 支持这种格式,因此它可以读取您的文件也就不足为奇了。

不幸的是,xlrdopenpyxl 等 Python 库仅支持 xlsxlsx 文件格式,因此它们将无法读取您的文件。我认为您只需手动将其转换为受支持的格式即可。

关于python - 如何在 Python 中加载最初具有 .xls 文件扩展名的 xlsx?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31212104/

相关文章:

python - 无法使用 Conda 安装任何东西

python - “Indentation Error: unindent does not match any outer indentation level”问题

Excel公式在数字(30)而不是50之后四舍五入到最接近的一百

python - 使用 DataNitro 连接 3 列(可能组合的总数)

python - wxPython 中的振动窗口

python - 新版Youcompleteme功能预览弹窗

python - 使用 Xarray 和 Numpy 数组进行多处理

python-2.7 - Urllib2 响应 .read() 为空,即使响应不是

python - 多处理 Python 中的写入错误