python 合并多個excel中同名的sheet
大家好~ 老Amy來啦!已經(jīng)n久沒有給大家輸出關(guān)于辦公自動化的文章了…為什么呢?羅列原因:
- 太忙!(被領(lǐng)導(dǎo)“壓榨”)
- 太忙!(沒有額外的精力揣測大家辦公的需求)
- 太忙!(持續(xù)吃瓜中)
然鵝,一位朋友的困惑成為了我這種“麻木狀態(tài)”的終結(jié)者,他提出需求如下:
想不斷嘗試的老Amy,開啟了思考模式:“我要怎么實(shí)現(xiàn)這個需求呢?”。
不用著急,首先我們來分析數(shù)據(jù)本身。
分析數(shù)據(jù)特征如下:
數(shù)據(jù)所在路徑 C:\Users\logic\Desktop\mytest\file_dir
data01.xlsx
數(shù)據(jù)如下:
data02.xlsx
數(shù)據(jù)如下:
由上可得信息如下:
- 所有 xlsx 工作簿都在同一個文件夾下
- data01.xlsx 與 data02.xlsx 中 sheet 名相同的進(jìn)行合并。也就是202001與202001合并,其它同理。
我們需要合并數(shù)據(jù),首先需要讀取到每個工作簿下每個工作表的數(shù)據(jù),實(shí)現(xiàn)流程如下:
- 獲取文件夾下所有工作簿名
- 拼接為絕對路徑
- 讀取所有表格數(shù)據(jù)
- 保存到空列表中
那要通過代碼完成上面的連環(huán)操作,我們就需要使用到 python 中的內(nèi)置模塊 os 模塊——與操作系統(tǒng)進(jìn)行交互的模塊,來獲取文件夾下所有工作簿名,代碼如下:
import os # 導(dǎo)入模塊 # 列出 C:\Users\logic\Desktop\mytest\file_dir 下所有文件名 file_name_li = os.listdir(r"C:\Users\logic\Desktop\mytest\file_dir") file_name_li --------------------------------------------------------------------- ['data01.xlsx', 'data02.xlsx']
但此時,無法只通過文件名去系統(tǒng)中找到對應(yīng)的文件,所以我們需要更準(zhǔn)確一點(diǎn)兒的地址——絕對路徑,所以現(xiàn)在我們需要拼接每個文件的絕對路徑。代碼如下:
# 遍歷出每個文件名 for file_name in file_name_li: # 將文件夾絕對路徑 與 文件名進(jìn)行拼接 file_path_li = os.path.join(r"C:\Users\logic\Desktop\mytest\file_dir",file_name) print(file_path_li) -------------------------------------------------------------------- C:\Users\logic\Desktop\mytest\file_dir\data01.xlsx C:\Users\logic\Desktop\mytest\file_dir\data02.xlsx
有了文件的絕對路徑后,我們就可以來讀取文件中的數(shù)據(jù),那就要使用到法寶 pandas 了。首先大家注意,pandas 并不是 python 的內(nèi)置模塊,而是需要我們?nèi)グ惭b的。然后使用 pandas 的 read_excel() 方法讀取數(shù)據(jù),但是需要注意的是,此時我們需要讀取的是工作簿下的所有工作表,所以需要指定 sheet_name 為 None,否則會默認(rèn)讀取第一個工作表。代碼如下:
# 遍歷出每個文件名 for file_name in file_name_li: # 將文件夾絕對路徑 與 文件名進(jìn)行拼接 file_path_li = os.path.join(r"C:\Users\logic\Desktop\mytest\file_dir",file_name) # 讀取 excel 表格數(shù)據(jù) all_data = pd.read_excel(file_path_li,sheet_name=None) print(all_data) -------------------------------------------------------------------- OrderedDict([('202001', 車牌號 駕駛員 起始公里 截至公里 里程數(shù) 加油金額 加油公升 0 鄂J0969 陳燕 186701.0 186935 234 267.07 32.41 1 鄂A25JL NaN NaN 0 0 NaN NaN 2 鄂A37NK 呂揚(yáng) 40283.0 40993 710 512.08 68.37 3 鄂A332B NaN NaN 0 0 NaN NaN 4 鄂A3J78L 尚超 0.0 33 33 NaN NaN 5 鄂A484ZF 魯浩 50286.0 52574 2288 1340.84 191.45 6 鄂A620J 袁耀 41398.0 43604 2206 1579.69 225.67 7 鄂A7A8Z 志勇 41560.0 42883 1323 788.48 107.57 8 鄂AJ37Y 劉沖 0.0 73 73 NaN NaN 9 鄂AD9251 毛義 3214.0 3349 135 NaN NaN 10 鄂AD2192 趙敏 434.0 796 362 NaN NaN),...], ...)
從上打印出的結(jié)果(我取了第一個),會發(fā)現(xiàn)它的類型為 OrderedDict ,雖然組合起來好像不是很看得懂,但是分開來看,它的本質(zhì)實(shí)際上是 Dict。所以實(shí)際上我們可以通過 202001 來獲取對應(yīng)的數(shù)據(jù)值。如:
# 遍歷出每個文件名 for file_name in file_name_li: # 將文件夾絕對路徑 與 文件名進(jìn)行拼接 file_path_li = os.path.join(r"C:\Users\logic\Desktop\mytest\file_dir",file_name) # 讀取 excel 表格數(shù)據(jù) all_data = pd.read_excel(file_path_li,sheet_name=None) print(all_data["202001"]) --------------------------------------------------------------------- 車牌號 駕駛員 起始公里 截至公里 里程數(shù) 加油金額 加油公升 0 鄂J0969 陳燕 186701.0 186935 234 267.07 32.41 1 鄂A25JL NaN NaN 0 0 NaN NaN 2 鄂A37NK 呂揚(yáng) 40283.0 40993 710 512.08 68.37 3 鄂A332B NaN NaN 0 0 NaN NaN 4 鄂A3J78L 尚超 0.0 33 33 NaN NaN 5 鄂A484ZF 魯浩 50286.0 52574 2288 1340.84 191.45 6 鄂A620J 袁耀 41398.0 43604 2206 1579.69 225.67 7 鄂A7A8Z 志勇 41560.0 42883 1323 788.48 107.57 8 鄂AJ37Y 劉沖 0.0 73 73 NaN NaN 9 鄂AD9251 毛義 3214.0 3349 135 NaN NaN 10 鄂AD2192 趙敏 434.0 796 362 NaN NaN 車牌號 駕駛員 起始公里 截至公里 里程數(shù) 加油金額 加油公升 0 鄂J0039 周鵬 15512 15512 0 NaN NaN 1 鄂J0021 王林 7790 7790 0 NaN NaN 2 鄂J0022 徐濤 373505 373505 0 NaN NaN 3 鄂J0079 趙舟 431169 431169 0 NaN NaN 4 鄂J0018 郭鷹 3635 3635 0 NaN NaN 5 鄂J0808 周尊 257743 257743 0 NaN NaN 6 鄂J01X3 胡志 72000 72150 150 159.26 25.16 7 鄂J01X0 吳軍 73031 73568 537 393.46 58.12 8 鄂J0F12 宋安 149017 149050 33 0.00 0.00 9 鄂J0F52 金煜 150617 150617 0 NaN NaN 10 鄂J0272 劉兵 58124 58305 181 0.00 0.00 11 鄂J02F2 胡飛 169665 169665 0 NaN NaN 12 鄂J0292 王勇 111625 113121 1496 1081.37 156.54 13 鄂J05R0 劉金 99278 99278 0 NaN NaN
從打印結(jié)果,可以發(fā)現(xiàn),我們通過 202001 可以取到兩個工作簿中 202001 的數(shù)據(jù),這是為什么呢?傻瓜,因?yàn)檠h(huán)呀~所以,現(xiàn)在我們就想,把數(shù)據(jù)都添加到一個列表中。除此之外,我們還需要工作表名來獲取數(shù)據(jù),也就是將工作表名保存到一個集合中(以便去重)。
# 定義文件名集合 all_file_name = set() # 定義數(shù)據(jù)列表 all_data_li = [] # 遍歷出每個文件名 for file_name in file_name_li: # 將文件夾絕對路徑 與 文件名進(jìn)行拼接 file_path_li = os.path.join(r"C:\Users\logic\Desktop\mytest\file_dir",file_name) # 讀取 excel 表格數(shù)據(jù) all_data = pd.read_excel(file_path_li,sheet_name=None) # 將數(shù)據(jù)添加到數(shù)據(jù)列表中 all_data_li.append(all_data) # 將工作表名添加到文件夾集合中 for name in all_data: all_file_name.add(name) print(all_data_li) print(all_file_name)
有了這些寶貝之后,我們就可以來實(shí)現(xiàn)非常關(guān)鍵的步驟了,也就是取出相同名稱的工作表進(jìn)行拼接保存到新的工作表中。
不過仍然要思考的是,我們怎么使用 pandas 給一個工作簿中添加多個工作表呢?那就需要使用 pd.ExcelWriter了。代碼如下:
# 創(chuàng)建工作簿 writer = pd.ExcelWriter("all_data.xlsx") # 遍歷每個工作表名 for sheet_name in all_file_name: data_li = [] # 遍歷數(shù)據(jù) for data in all_data_li: # 獲取同名數(shù)據(jù)并添加到data_li中 n_rows = data_li.append(data[sheet_name]) # 將同名數(shù)據(jù)進(jìn)行拼接 group_data = pd.concat(data_li) # 保存到writer工作簿中,并指定工作表名為sheet_name group_data.to_excel(writer,sheet_name=sheet_name) # 千萬莫忘記,保存工作簿 writer.save()
就醬,實(shí)現(xiàn)完畢啦~哈哈哈哈哈
以上就是python 合并多個excel中同名的sheet的詳細(xì)內(nèi)容,更多關(guān)于python 合并excel中的sheet的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解Python+Pyecharts實(shí)現(xiàn)漏斗圖的繪制
漏斗圖是一個簡單的散點(diǎn)圖,反映研究在一定樣本量或精確性下單個研究的干預(yù)效應(yīng)估計值。本文將用Python Pyecharts實(shí)現(xiàn)漏斗圖的繪制,需要的可以參考一下2022-06-06python實(shí)現(xiàn)Oracle查詢分組的方法示例
這篇文章主要介紹了python實(shí)現(xiàn)Oracle查詢分組的方法,結(jié)合實(shí)例形式分析了python使用group by子句及having子句實(shí)現(xiàn)Oracle查詢分組的相關(guān)操作技巧,需要的朋友可以參考下2020-04-04linux環(huán)境打包python工程為可執(zhí)行程序的過程
本次需求,在ubuntu上面開發(fā)的python代碼程序需要打包成一個可執(zhí)行程序然后交付給甲方,因?yàn)椴荒苤苯咏o源碼給甲方,所以尋找方法將python開發(fā)的源碼打包成一個可執(zhí)行程序,本次在ubuntu上打包python源碼的方法和在window上打包的有點(diǎn)類似,感興趣的朋友跟隨小編一起看看吧2024-01-01如何通過python代碼根據(jù)模板修改變量生成新yaml文件
有些時候,需要根據(jù)一個yaml模板創(chuàng)建多個yaml文件實(shí)例,我們先寫一個yaml文件模板,然后通過python代碼修改模板中的變量,存儲為一個新的yaml文件,需要配合python的庫Template及ymal使用,本文給大家講解的非常詳細(xì),需要的朋友跟隨小編一起看看吧2023-11-11django中上傳圖片分頁三級聯(lián)動效果的實(shí)現(xiàn)代碼
這篇文章主要介紹了django中上傳圖片分頁三級聯(lián)動效果的實(shí)現(xiàn)代碼,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧2019-08-08