如何用python將文件夾內(nèi)多個excel表格合并成總表
前言:
本文講述使用python將需要處理的文件夾內(nèi)多個excel文件內(nèi)容進行合并,并輸出為xlsx格式的總表。就比如一個文件夾里又有許多子文件夾,這些子文件夾里分布有excel文件,這里的python文件就能將這個文件夾內(nèi)的所有excel文件進行合并成總表,不管里面是否還有其他文件格式就比如dox、jpg、py等,更不用說這個文件夾內(nèi)只含有excel文件。
本文還使用了GUI界面使操作更加簡潔,并介紹了將其打包成exe可執(zhí)行文件的步驟,讓它使用的更廣泛了。由于進行了模塊化設(shè)計,各個步驟使用了函數(shù)封裝。
1.引入庫:
需要引入5個庫,分別如下。其中xlrd庫是用于xls格式的讀取,openpyxl庫是用于xlsx格式的讀取,而openpyxl庫既可以用于xls格式的寫入,又可以用于xlsx格式的寫入。os是操作系統(tǒng)的庫,python自帶庫。tkinter是GUI界面的庫,其中filedialog是tkinter中的文件對話框,它的作用類似我們下載一個東西需選擇下在哪個地方的界面。
import xlrd import os import openpyxl import tkinter as tk import tkinter.filedialog
獲取excel文件的路徑:
這一部分總的代碼如下。
import xlrd import os import openpyxl import tkinter as tk import tkinter.filedialog
然后分開來單獨看各個代碼的作用
filename = 'C:/Users/86182/Desktop/需要處理的文件夾' for root, dirs, files in os.walk('{}'.format(filename)): print(root) print(files)
filename為需要處理的文件夾的絕對路徑,就比如C:/Users/86182/Desktop/需要處理的文件夾,可以自己查看自己電腦某個文件的路徑,這里使用filename是為了之后與其它模塊銜接??梢钥聪螺敵龅慕Y(jié)果:
這串代碼的作用是遍歷需要處理文件夾內(nèi)所有文件,root的作用是返回文件的路徑,而file的作用是以列表形式返還文件名。父文件夾’需要處理的文件夾‘內(nèi)只有兩個子文件夾,分別為’戰(zhàn)斗師‘,’魔法師‘。戰(zhàn)斗師文件夾里有'戰(zhàn)斗師相關(guān).doc', '戰(zhàn)斗師相關(guān)數(shù)據(jù).xlsx'這兩個文件。魔法師文件夾里有'魔法師相關(guān).doc', '魔法師相關(guān)數(shù)據(jù).xls'這兩個文件,直觀如下。注意對于root,需要處理的文件夾\戰(zhàn)斗師,中間是反斜杠\與其他不同,后面會利用這個性質(zhì)。
接下來:
root_files_Global = [] def find_excel():#定義獲取excel文件路徑 for root, dirs, files in os.walk('{}'.format(filename)): for i in range(len(files)): if 'xls' in files[i] or 'xlsx' in files[i]: root_files_Global.append(root+'/'+files[i]) find_excel() print(root_files_Global)
對于for i in range(len(files))循環(huán)下,如果files列表內(nèi)第i個元素中有'xls'、'xlsx'字符串在內(nèi)(即判斷excel文件),則在root_files_Global列表內(nèi)添加文件的路徑加名稱。這樣在整個循環(huán)內(nèi),就能把需要處理的文件夾內(nèi)的所有excel文件的路徑加名稱全部添加到root_files_Global列表內(nèi)??梢钥匆幌逻@一部分運行的結(jié)果:
3.對excel文件內(nèi)容的讀取
由于對excel文件的讀取分xls與xlsx格式的讀取,所以需要分別引用xlrd庫與openpyxl庫,不過他們讀取內(nèi)容的過程相似,可以仿照。這一部分的總代碼如下:
row = [] column = [] value = [] f0 = 0 def read_excel_xls():#定義讀取xls文件格式函數(shù) global f0 wb = xlrd.open_workbook(root_files_Global[t]) sheet_names = wb.sheet_names() sheet = wb.sheet_by_name(sheet_names[0]) for r in range(sheet.nrows): for c in range(sheet.ncols): va = sheet.cell(r, c).value row.append(r+f0) column.append(c) value.append(va) f0 = f0 + sheet.nrows def read_excel_xlsx():#定義讀取xlsx文件格式的函數(shù),使用openpyxl global f0 wb = openpyxl.load_workbook(root_files_Global[t]) ws = wb.worksheets[0] for r in range(ws.max_row): for c in range(ws.max_column): va = ws.cell(r+1, c+1).value row.append(r + f0) column.append(c) value.append(va) f0 = f0 + ws.max_row
這一部分我們就主要看read_excel_xls()這個定義的函數(shù),read_excel_xlsx()可以仿照。9-11行作用是打開excel表格內(nèi)第一個sheet表格(具體可以查看xlrd庫相關(guān)內(nèi)容)。sheet.nrows表示表格的行數(shù),sheet.ncols表示表格的列數(shù),第24行至25行表示在每一行遍歷每一列;va = ws.cell(r+1, c+1).value的作用為獲取第r+1行、c+1列的內(nèi)容并返還對象va。將內(nèi)容行數(shù)信息和列數(shù)信息分別儲存在row=[]、column=[]這兩個列表里,將內(nèi)容信息儲存在value=[]列表里。這里f0的使用是比較重要的,如果沒有f0,當循環(huán)到下一個文件,行數(shù)與列數(shù)的信息就又重0開始了,而我們之后需要寫入一個總表,行數(shù)信息就應(yīng)該自上個文件的最大行數(shù)再往下。f0的作用就是讓行數(shù)信息接著往下。
為了使按照順序讀取多個excel文件,可以使用如下代碼:
for t in range(len(root_files_Global)): if 'xlsx' in root_files_Global[t]: read_excel_xlsx() elif 'xls' in root_files_Global[t]: read_excel_xls()
4.寫入excel總表
這一部分就比較簡單了,總的代碼如下:
def write_excel_xlsx():#定義寫入xlsx文件格式的函數(shù),使用openpyxl wb = openpyxl.Workbook() ws = wb.worksheets[0] for i in range(len(row)): ws.cell(row[i]+1,column[i]+1).value = value[i] wb.save('總表.xlsx')
openpyxl.Workbook()創(chuàng)建一個xlsx格式excel文件并返還wb對象,打開這個文件的第一個sheet表格,第4行到第5行代碼為按照行的信息和數(shù)的信息寫入內(nèi)容,wb.save('總表.xlsx')最后保存總表。
到這里大致python代碼就完成了。接下來引入GUI、打包exe可執(zhí)行化文件。
5.設(shè)置GUI界面
這一步分總的代碼如下:
def askfile():#選擇文件夾 global filename filename = tk.filedialog.askdirectory() if filename !='': label2.config(text=filename) print(filename) else: label2.config(text='您沒有選擇任何文件夾') def GUI_excel(): global label2 window = tk.Tk() window.geometry('600x300') window.title('excel合成') label1 = tk.Label(window,text='請選擇需要處理的文件夾,選擇好就已經(jīng)處理完畢,如需重新處理,刪除合成好的表并重新啟動程序') label1.place(x=15,y=10) label2 = tk.Label(window,text='') label2.place(x=15,y=30) button1 = tk.Button(window,text='選擇文件夾',bg='blue',fg='white',command=askfile()) button1.place(x=15,y=60) window.mainloop()
window = tk.Tk()
window.geometry('600x300')
window.title('excel合成')
這三行代碼用于創(chuàng)建一個大小為’600*300‘GUI界面,標題名稱為excel合成,label1是一個標簽用為提示相關(guān)信息,label2主要是為了搭配askfile()函數(shù)使用。
再設(shè)置一個按鈕button1,它的功能就是askfile(),而askfile()的作用類似我們下載一個東西需選擇下在哪個地方的界面,就如下:
到現(xiàn)在所有代碼都已經(jīng)完成,我把總的代碼寫在下面,需要自?。?/p>
#只針對sheet1/支持xls、xlsx/最后輸出xlsx格式總表 #可以修改文件價名稱/匯總xls、xlsx表格 import xlrd import os import openpyxl import tkinter as tk import tkinter.filedialog root_files_Global = [] row = [] column = [] value = [] f0 = 0 def askfile():#選擇文件夾 global filename filename = tk.filedialog.askdirectory() if filename !='': label2.config(text=filename) print(filename) else: label2.config(text='您沒有選擇任何文件夾') def GUI_excel(): global label2 window = tk.Tk() window.geometry('600x300') window.title('excel合成') label1 = tk.Label(window,text='請選擇需要處理的文件夾,選擇好就已經(jīng)處理完畢,如需重新處理,刪除合成好的表并重新啟動程序') label1.place(x=15,y=10) label2 = tk.Label(window,text='') label2.place(x=15,y=30) button1 = tk.Button(window,text='選擇文件夾',bg='blue',fg='white',command=askfile()) button1.place(x=15,y=60) window.mainloop() GUI_excel() def find_excel():#定義獲取excel文件路徑 for root, dirs, files in os.walk('{}'.format(filename)): for i in range(len(files)): if 'xls' in files[i] or 'xlsx' in files[i]: root_files_Global.append(root+'/'+files[i]) find_excel() print(root_files_Global) def read_excel_xls():#定義讀取xls文件格式函數(shù) global f0 wb = xlrd.open_workbook(root_files_Global[t]) sheet_names = wb.sheet_names() sheet = wb.sheet_by_name(sheet_names[0]) for r in range(sheet.nrows): for c in range(sheet.ncols): va = sheet.cell(r, c).value row.append(r+f0) column.append(c) value.append(va) f0 = f0 + sheet.nrows def read_excel_xlsx():#定義讀取xlsx文件格式的函數(shù),使用openpyxl global f0 wb = openpyxl.load_workbook(root_files_Global[t]) ws = wb.worksheets[0] for r in range(ws.max_row): for c in range(ws.max_column): va = ws.cell(r+1, c+1).value row.append(r + f0) column.append(c) value.append(va) f0 = f0 + ws.max_row for t in range(len(root_files_Global)): if 'xlsx' in root_files_Global[t]: read_excel_xlsx() elif 'xls' in root_files_Global[t]: read_excel_xls() def write_excel_xlsx():#定義寫入xlsx文件格式的函數(shù),使用openpyxl wb = openpyxl.Workbook() ws = wb.worksheets[0] for i in range(len(row)): ws.cell(row[i]+1,column[i]+1).value = value[i] wb.save('總表.xlsx') write_excel_xlsx()
6.打包成exe可執(zhí)行文件
如果直接使用install進行打包會使壓縮包達到兩、三百兆的樣子。傳輸起來會非常不方便。所以這里需要python創(chuàng)建虛擬環(huán)境,由于我使用的是Anaconda,所以在這里只介紹相關(guān)內(nèi)容,大家可以上網(wǎng)搜如何下載,這里我就不過多介紹了。
先介紹幾個conda命令
conda create -n 虛擬環(huán)境名字 python==3.1 #創(chuàng)建虛擬環(huán)境
conda activate 虛擬環(huán)境名字 #激活虛擬環(huán)境
conda deactivate #退出虛擬環(huán)境
下載好后,從開始菜單運行“Anaconda Prompt”,使用上述第一個命令創(chuàng)建名為‘excel’的虛擬環(huán)境,如下:
在創(chuàng)建過程中需要回復(fù)(y/n),Yes,再激活虛擬環(huán)境
使用conda activate 虛擬環(huán)境名字 #激活虛擬環(huán)境,剛剛我們創(chuàng)建的虛擬環(huán)境名字為excel,結(jié)果如下:
這樣就代表激活好了,現(xiàn)在可以使用conda list來看下這個虛擬環(huán)境所安裝的一些庫:
由于我們腳本還需要使用xlrd、openpyxl這兩個庫,而tkinter庫和os庫是python自帶庫,所以只需要將這兩個庫加載到虛擬環(huán)境中,當然還必不可打包的庫pyinstaller;使用如下安裝庫(直接輸入就好):
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple xlrd
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple openpyxl
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyinstaller
現(xiàn)在我已經(jīng)安裝好了。現(xiàn)在只需你新建個文件夾,將py文件放進去,在進行如下操作就好了
我的py文件名稱為excel合成,并將它放在了excel合成總表這個文件夾里了,
所以cd C:/Users/86182/Desktop/excel合成總表這邊轉(zhuǎn)到自己的路徑就好了,這樣文件就打包好了,可執(zhí)行化文件在剛剛那個文件夾中的dist里面
到現(xiàn)在就結(jié)束了。
總結(jié):
雖然此方法將多個excel表格內(nèi)的內(nèi)容進行了合并,但是還存在一個問題就是,并不能將excel的格式一起合并起來,不過后面我會在學(xué)習(xí)以下,看能不能解決。
到此這篇關(guān)于如何用pyhton將文件夾內(nèi)多個excel表格合并成總表的文章就介紹到這了,更多相關(guān)pyhton將多個excel表格合并內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python之Django自動實現(xiàn)html代碼(下拉框,數(shù)據(jù)選擇)
這篇文章主要介紹了Python之Django自動實現(xiàn)html代碼(下拉框,數(shù)據(jù)選擇),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03Blender?Python編程實現(xiàn)批量導(dǎo)入網(wǎng)格并保存渲染圖像
這篇文章主要為大家介紹了Blender?Python?編程實現(xiàn)批量導(dǎo)入網(wǎng)格并保存渲染圖像示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08Python數(shù)據(jù)清洗之抽取jsonl文件數(shù)據(jù)字段并合并
這篇文章主要為大家詳細介紹了Python數(shù)據(jù)清洗之抽取jsonl文件數(shù)據(jù)字段并合并的相關(guān)知識,文中的示例代碼講解詳細,感興趣的小伙伴可以了解下2025-03-03Pytest單元測試框架生成HTML測試報告及優(yōu)化的步驟
本文主要介紹了Pytest單元測試框架生成HTML測試報告及優(yōu)化的步驟,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01