最近有位老鐵输瓜,他手頭上有四百多個(gè)Excel文件,每個(gè)文件的記錄數(shù)都達(dá)到百萬行左右猿规,他很苦惱衷快,因?yàn)橄氚堰@些文件都合并到一起,但Excel最大的記錄數(shù)是1048576姨俩,他沒有辦法烦磁,所以咨詢我,看有什么方法可以做到把這些記錄都合并到一起哼勇。
我給他推薦的方案是,使用Python + Mysql, 實(shí)現(xiàn)Excel數(shù)據(jù)的自動(dòng)讀取和數(shù)據(jù)導(dǎo)入呕乎。
平均200M的Excel文件公有474個(gè)
為了方便使用Python积担,安裝了Anaconda,做Python的環(huán)境管理;安裝了MySQL的社區(qū)版和Workbench猬仁,方便對數(shù)據(jù)的操作帝璧。
Anaconda可以直接到官網(wǎng)上下載,下載后安裝到電腦上就可以湿刽,安裝過程就不細(xì)說的烁;MySQL也可以到官網(wǎng)上下載,下載后安裝到電腦上诈闺,這里需要注意的是渴庆,安裝開發(fā)者版本,里面包含了數(shù)據(jù)庫實(shí)例和Workbench等工具雅镊。
我重點(diǎn)說下Python代碼襟雷,如何使用Pandas庫讀取Excel,批量寫入Mysql數(shù)據(jù)庫。
首先打開Anaconda Navigator, 然后再打開Jupyter notebook,檢查環(huán)境里是否包括了如下Python庫 :
1)Pandas仁烹;
2)sqlalchemy耸弄;
3)openpyxl.
-Panda 庫用是用來處理Excel的;
-Sqlalchemy用來管理Mysql,
-Openpyxl用來讀取xlsx后綴的大數(shù)據(jù)量Excel文件。
如果某個(gè)庫不存在的話卓缰,可以通過Anaconda prompt來安裝计呈,舉例砰诵,命令行輸入pip install openpyxl。
如果所有庫都準(zhǔn)備好后捌显,新建一個(gè)Python 3腳本文件茁彭,輸入如下代碼
#引入之前安裝好的python庫
import pandas as pd
import os
from sqlalchemy import create_engine
import datetime
#遍歷存放Excel文件的目錄,獲取Excel文件的絕對路徑
path = r'D:/data/2'
files = os.listdir(path)
for i in files:
path1 = path + '/' + i
print(path1)
#因?yàn)槲募喜⒑笫怯邢群蟠涡虻奈辏陨厦娴拇a會(huì)把文件的名字打印出來尉间,可以
#檢查文件名的排序是否正確
#檢查完文件名排序正確后,創(chuàng)建MySQL連接器
engine = create_engine('mysql+pymysql://root:~1Qaz2Wsx@localhost/fang?charset=utf8MB4')
conn = engine.connect()
#為了記錄已經(jīng)導(dǎo)入Excel文件的個(gè)數(shù)击罪,先定義一個(gè)文件數(shù)的變量
file_number = 0
#通過遍歷所有的Excel文件哲嘲,把Excel里的數(shù)據(jù)都導(dǎo)入到MySQL數(shù)據(jù)庫里
for i in files:
path1 = path + '/'+I #i是文件名
print(path1)
starttime = datetime.datetime.now() #記錄開始時(shí)間
print(starttime)
data = pd.read_excel(path1,engine = 'openpyxl',header =
3,usecols='A:AR')
#header指從第4行開始,并以第4行作為列頭媳禁,usecols指只讀取從A列到AR列的數(shù)據(jù)眠副,其他列的數(shù)據(jù)都不要,openpyxl指使用大數(shù)#據(jù)量的引擎竣稽,
把數(shù)據(jù)從Excel里讀入內(nèi)存里的Pandas Dataframe
data.to_sql(name='mdg',con=conn,index=False,if_exists='append') #然后再把數(shù)據(jù)從data frame導(dǎo)入到mysql
endtime = datetime.datetime.now() #完成后囱怕,打印完成時(shí)間
print(endtime)
duration = endtime - starttime #計(jì)算單個(gè)文件導(dǎo)入消耗時(shí)間(秒)
print(duration.seconds)
代碼執(zhí)行過程會(huì)產(chǎn)生日志