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

場景

今天需要合并天貓訂單數(shù)據,由于前期6.18活動有很多數(shù)據需要處理,將幾個月份合并一起,結果報錯。


image.png

問題分析

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

Pandas 讀取 Excel 文件的引擎是 xlrd , xlrd 雖然同時支持 .xlsx 和 .xls 兩種文件格式,但是在源碼文件 xlrd/sheet.py 中限制了讀取的 Excel 文件行數(shù)必須小于 65536,列數(shù)必須小于 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 文件(源碼中還有一個行數(shù)限制是 16384,這是因為 Excel 95 時代, xls 文件所支持的最大行數(shù)是 16384)。

解決辦法

openpyxl 是一個專門用來操作 .xlsx 格式文件的 Python 庫,和 xlrd 相比它對于最大行列數(shù)的支持和 .xlsx 文件所定義的最大行列數(shù)一致。
首先安裝 openpyxl :

pip install openpyxl

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

import os
import pandas as pd

# 將文件讀取出來放一個列表里面

pwd = '1'  # 獲取文件目錄

# 新建列表,存放文件名
file_list = []

# 新建列表存放每個文件數(shù)據(依次讀取多個相同結構的Excel文件并創(chuàng)建DataFrame)
dfs = []

for root,dirs,files in os.walk(pwd):  # 第一個為起始路徑,第二個為起始路徑下的文件夾,第三個是起始路徑下的文件。
    for file in files:
        file_path = os.path.join(root, file)
        file_list.append(file_path)  # 使用os.path.join(dirpath, name)得到全路徑
        df = pd.read_excel(file_path)  # 導入xlsx文件,將excel轉換成DataFrame
        dfs.append(df)
        


# 將多個DataFrame合并為一個
df = pd.concat(dfs)

# 數(shù)據輸出,寫入excel文件,不包含索引數(shù)據
# 數(shù)據寫入 Excel,需要首先安裝一個 engine,由 engine 負責將數(shù)據寫入 Excel,pandas 使用 openpyx 或 xlsxwriter 作為寫入引擎。
df.to_excel('test\\1.xlsx', index=False,engine='openpyxl') # 導出 Excel,一般不需要索引,將 index 參數(shù)設為 False

www.qmpython.com

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容