使用 Pandas 讀取超過 65536 行的 Excel 文件

問題描述

使用 Pandas 的 read_excel 方法讀取一個 16 萬行的 Excel 文件報 AssertionError 錯誤:

  "/Users/Zzy/Desktop/test/csv_test/venv/lib/python3.7/site-packages/xlrd/xlsx.py", line 637, in do_row
    assert 0 <= self.rowx < X12_MAX_ROWS
AssertionError

背後原理

Excel 文件的格式曾經發生過一次變化,在 Excel 2007 以前,使用擴展名爲 .xls 格式的文件,這種文件格式是一種特定的二進制格式,最多支持 65,536 行,256 列表格。從 Excel 2007 版開始,默認採用了基於 XML 的新的文件格式 .xlsx,支持的表格行數達到了 1,048,576,列數達到了 16,384。需要注意的是,將 .xlsx 格式的文件轉換爲 .xls 格式的文件時,65536 行和 256 列之後的數據都會被丟棄。

版本 最大行數 最大列數 文件格式
早於 Excel 2007 的版本 65,536 256 .xls
Excel 2007 及以後版本 1,048,576 16,384 .xlsx

Pandas 讀取 Excel 文件的引擎是 xlrdxlrd 雖然同時支持 .xlsx.xls 兩種文件格式,但是在源碼文件 xlrd/sheet.py 中限制了讀取的 Excel 文件行數必須小於 65536,列數必須小於 256。

if self.biff_version >= 80:
    self.utter_max_rows = 65536
else:
    self.utter_max_rows = 16384
self.utter_max_cols = 256

這就導致,即使是 .xlsx 格式的文件,xlrd 依然不支持讀取 65536 行以上的 Excel 文件(源碼中還有一個行數限制是 16384,這是因爲 Excel 95 時代,xls 文件所支持的最大行數是 16384)。

解決辦法

openpyxl 是一個專門用來操作 .xlsx 格式文件的 Python 庫,和 xlrd 相比它對於最大行列數的支持和 .xlsx 文件所定義的最大行列數一致。

首先安裝 openpyxl

pip install openpyxl

Pandas 的 read_excel 方法中,有 engine 字段,可以指定所使用的處理 Excel 文件的引擎,填入 openpyxl,再讀取文件就可以了。

import pandas as pd


df = pd.read_excel('./data.xlsx', engine='openpyxl')
print(len(df))  # 160000

參考文檔

https://en.wikipedia.org/wiki/Microsoft_Excel

https://office-watch.com/2010/excel-a-history-of-rows-and-columns/

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_excel.html

https://openpyxl.readthedocs.io

https://github.com/python-excel/xlrd/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章