問題描述
使用 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 文件的引擎是 xlrd
,xlrd
雖然同時支持 .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