回復「書籍」即可獲贈Python從入門到進階共10本電子書
一、前言大家好,我是崔豔飛。前兩天給大家分享了Python自動化文章:手把手教你利用Python輕鬆拆分Excel為多個CSV文件,而後在Python進階交流群裡邊有讀者遇到一個問題,他有很多個Excel表格,他需要對這些Excel文件進行合併。
誠然,一個一個打開複製粘貼固然可行,但是該方法費時費力,還容易出錯,幾個文件還可以手動處理,要是幾十個甚至上百個,你就抓瞎了,不過這問題對Python來說,so easy,一起來看看吧!
二、項目目標用Python實現多Excel、多Sheet的合併處理。
軟體:PyCharm
需要的庫:pandas, xlrd,os
利用os,獲取所有要合併的Excel文件。
2)如何選擇要合併的Sheet?利用xlrd庫進行Excel讀取,獲取要合併的Sheet名。
3)如何合併?利用pandas庫,對所有Sheet名逐一循環打開,通過concat()進行數據追加合併即可。
4)如何保存文件?利用to_excel保存數據,得到最終合併後的目標文件。
import pandas as pdimport xlrdimport os2、第二步選擇要合併的Excel文件path="D:/b/" xlsx_names = [x for x in os.listdir(path) if x.endswith(".xlsx")]3、第三步選擇要合併的Sheetxlsx_names1 = xlsx_names[0]
aa = path + xlsx_names1 first_file_fh=xlrd.open_workbook(aa) first_file_sheet=first_file_fh.sheets()4、第四步對Sheet內容進行循環合併for sheet_name in sheet_names: df = None for xlsx_name in xlsx_names: sheet_na = pd.ExcelFile(path + xlsx_name).sheet_names if sheet_name in sheet_na: _df = pd.read_excel(path + xlsx_name, sheet_name=sheet_name,header=None) if df is None: df = _df else: df = pd.concat([df, _df], ignore_index=True) else:continue5、第五步保存合併後的文件df.to_excel(excel_writer=writer, sheet_name=sheet_name, encoding="utf-8", index=False) print(sheet_name + " 保存成功!共%d個,第%d個。" % (len(sheet_names),num)) num += 1 writer.save() writer.close()六、效果展示1、處理前Excel數據:
2、運行進度提示:
3、合併後的結果:
七、總結
本文介紹了如何利用Python對多個Excel文件、多Sheet進行合併處理,減少了很多複製粘貼的麻煩,省時省力,還不容易出錯,代碼不多,循環追加有點繞,想想也就明白了,不懂的隨時留言提問,大家一起學習進步。
有想法的小夥伴還可以將文章中的代碼進行打包,做成一個exe可執行的小軟體,包裝好發給別人使用,也可以賺點小費噢,關於打包的教程這裡不再贅述,歡迎前往:三個你必須要記住的Pyinstaller打包命令——利用Python實現打包exe。
八、彩蛋
下面兩份代碼是群內小夥伴提供了,小編也自行測試了下,親測有效,歡迎大家積極嘗試噢!
來自群友Jayson的代碼:
import os import globimport openpyxl
def merge_xlsx_files(xlsx_files): wb = openpyxl.load_workbook(xlsx_files[0]) ws = wb.active ws.title = "merged result"
for filename in xlsx_files[1:]: workbook = openpyxl.load_workbook(filename) sheet = workbook.active for row in sheet.iter_rows(min_row=1): values = [cell.value for cell in row] ws.append(values) return wb
def get_all_xlsx_files(path): xlsx_files = glob.glob(os.path.join(r'C:\\Users\\pdcfi\\Desktop\\', '*.xlsx')) sorted(xlsx_files, key=str.lower) return xlsx_files
def main(): xlsx_files = get_all_xlsx_files(os.path.expanduser('~lmx')) wb = merge_xlsx_files(xlsx_files) wb.save('merged_form.xlsx')
if __name__ == '__main__': main() print("all excel append OK!")來自好友劉早起的代碼:
from openpyxl import load_workbook, Workbookimport glob
path = "C:\\Users\\pdcfi\\Desktop\\excel\\"new_workbook = Workbook()new_sheet = new_workbook.active
flag = 0
for file in glob.glob(path + '/*.xlsx'): workbook = load_workbook(file) sheet = workbook.active
coloum_A = sheet['A'] row_lst = [] for cell in coloum_A: if cell: print(cell.row) row_lst.append(cell.row)
if not flag: header = sheet[1] header_lst = [] for cell in header: header_lst.append(cell.value) new_sheet.append(header_lst) flag = 1
for row in row_lst: data_lst = [] for cell in sheet[row]: data_lst.append(cell.value) new_sheet.append(data_lst)
new_workbook.save(path + '/' + '符合篩選條件的新表.xlsx')來自群友Engineer的代碼:
import tkinter as tkfrom tkinter import filedialogimport osimport pandas as pdimport glob
root = tk.Tk()root.withdraw()
filelocation = os.path.normpath(filedialog.askdirectory(initialdir=os.getcwd()))lst = []
for i in glob.glob(filelocation + "\\\\" + "*.*"): if os.path.splitext(i)[1] in [".xls", ".xlsx"]: lst.append(pd.read_excel(i))
writer = pd.ExcelWriter(filedialog.asksaveasfilename(title="保存", initialdir=filelocation, defaultextension="xlsx", filetypes=[("Excel 工作簿", "*.xlsx"), ("Excel 97-2003 工作簿", "*.xls")]))pd.concat(lst).to_excel(writer, 'all', index=False)writer.save()
print('\n%d個文件已經合併成功!' % len(lst))最後需要本文項目代碼的小夥伴,請在公眾號後臺回復「合併文件」關鍵字進行獲取,如果在運行過程中有遇到任何問題,請隨時留言或者加小編好友,小編看到會幫助大家解決bug噢!
當然了,實現本文功能不僅僅限於上面提及的3種方式,使用pandas也是可以做到的,如果你還有其他方法,歡迎交個朋友一起學習交流。
小編最近建立了一個Python付費學習交流群,只需要9.99元小紅包即可入群學習交流,大家的學習氛圍很好,有問必答,裡邊「無絲竹亂耳,亦無案牘勞形」,純交流學習之用,感興趣的小夥伴可以加下方小編微信進群學習交流噢!
------------------- End -------------------
往期精彩文章推薦:
歡迎大家點讚,留言,轉發,轉載,感謝大家的相伴與支持
想加入Python學習群請在後臺回復【入群】
萬水千山總是情,點個【在看】行不行
/今日留言主題/
隨便說一兩句吧~