場景
今天需要合并天貓訂單數(shù)據(jù)吊奢,由于前期6.18活動(dòng)有很多數(shù)據(jù)需要處理央勒,將幾個(gè)月份合并一起,結(jié)果報(bào)錯(cuò)葱跋。
問題分析
Excel 文件的格式曾經(jīng)發(fā)生過一次變化持寄,在 Excel 2007 以前,使用擴(kuò)展名為 .xls 格式的文件娱俺,這種文件格式是一種特定的二進(jìn)制格式稍味,最多支持 65,536 行,256 列表格荠卷。從 Excel 2007 版開始模庐,默認(rèn)采用了基于 XML 的新的文件格式 .xlsx ,支持的表格行數(shù)達(dá)到了 1,048,576油宜,列數(shù)達(dá)到了 16,384掂碱。需要注意的是,將 .xlsx 格式的文件轉(zhuǎn)換為 .xls 格式的文件時(shí)验庙,65536 行和 256 列之后的數(shù)據(jù)都會被丟棄顶吮。
Pandas 讀取 Excel 文件的引擎是 xlrd , xlrd 雖然同時(shí)支持 .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
這就導(dǎo)致,即使是 .xlsx 格式的文件湃交, xlrd 依然不支持讀取 65536 行以上的 Excel 文件(源碼中還有一個(gè)行數(shù)限制是 16384熟空,這是因?yàn)?Excel 95 時(shí)代, xls 文件所支持的最大行數(shù)是 16384)搞莺。
解決辦法
openpyxl 是一個(gè)專門用來操作 .xlsx 格式文件的 Python 庫息罗,和 xlrd 相比它對于最大行列數(shù)的支持和 .xlsx 文件所定義的最大行列數(shù)一致。
首先安裝 openpyxl :
pip install openpyxl
Pandas 的 read_excel 方法中才沧,有 engine 字段迈喉,可以指定所使用的處理 Excel 文件的引擎,填入 openpyxl 温圆,再讀取文件就可以了挨摸。
import os
import pandas as pd
# 將文件讀取出來放一個(gè)列表里面
pwd = '1' # 獲取文件目錄
# 新建列表,存放文件名
file_list = []
# 新建列表存放每個(gè)文件數(shù)據(jù)(依次讀取多個(gè)相同結(jié)構(gòu)的Excel文件并創(chuàng)建DataFrame)
dfs = []
for root,dirs,files in os.walk(pwd): # 第一個(gè)為起始路徑岁歉,第二個(gè)為起始路徑下的文件夾得运,第三個(gè)是起始路徑下的文件。
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) # 導(dǎo)入xlsx文件锅移,將excel轉(zhuǎn)換成DataFrame
dfs.append(df)
# 將多個(gè)DataFrame合并為一個(gè)
df = pd.concat(dfs)
# 數(shù)據(jù)輸出熔掺,寫入excel文件,不包含索引數(shù)據(jù)
# 數(shù)據(jù)寫入 Excel非剃,需要首先安裝一個(gè) engine置逻,由 engine 負(fù)責(zé)將數(shù)據(jù)寫入 Excel,pandas 使用 openpyx 或 xlsxwriter 作為寫入引擎备绽。
df.to_excel('test\\1.xlsx', index=False,engine='openpyxl') # 導(dǎo)出 Excel诽偷,一般不需要索引,將 index 參數(shù)設(shè)為 False