這篇文章主要介紹了python 如何合併多個excel中同名的sheet,幫助大家更好地利用python處理excel表格,感興趣的朋友可以瞭解下
大家好~ 老Amy來啦!已經n久沒有給大家輸出關於辦公自動化的文章了…為什麼呢?羅列原因:
太忙!(被領導“壓榨”)太忙!(沒有額外的精力揣測大家辦公的需求)太忙!(持續吃瓜中)然鵝,一位朋友的困惑成為了我這種“麻木狀態”的終結者,他提出需求如下:
想不斷嘗試的老Amy,開啟了思考模式:“我要怎麼實現這個需求呢?”。
不用著急,首先我們來分析資料本身。
分析資料特徵如下:資料所在路徑 C:\Users\logic\Desktop\mytest\file_dir
data01.xlsx 資料如下:
data02.xlsx 資料如下:
由上可得資訊如下:
所有 xlsx 工作簿都在同一個資料夾下data01.xlsx 與 data02.xlsx 中 sheet 名相同的進行合併。也就是202001與202001合併,其它同理。我們需要合併資料,首先需要讀取到每個工作簿下每個工作表的資料,實現流程如下:
獲取資料夾下所有工作簿名拼接為絕對路徑讀取所有表格資料儲存到空列表中那要透過程式碼完成上面的連環操作,我們就需要使用到 python 中的內建模組 os 模組——與作業系統進行互動的模組,來獲取資料夾下所有工作簿名,程式碼如下:
import os # 匯入模組
# 列出 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']
但此時,無法只通過檔名去系統中找到對應的檔案,所以我們需要更準確一點兒的地址——絕對路徑,所以現在我們需要拼接每個檔案的絕對路徑。程式碼如下:
# 遍歷出每個檔名
for file_name in file_name_li:
# 將資料夾絕對路徑 與 檔名進行拼接
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
有了檔案的絕對路徑後,我們就可以來讀取檔案中的資料,那就要使用到法寶 pandas 了。首先大家注意,pandas 並不是 python 的內建模組,而是需要我們去安裝的。然後使用 pandas 的 read_excel() 方法讀取資料,但是需要注意的是,此時我們需要讀取的是工作簿下的所有工作表,所以需要指定 sheet_name 為 None,否則會預設讀取第一個工作表。程式碼如下:
# 遍歷出每個檔名
for file_name in file_name_li:
# 將資料夾絕對路徑 與 檔名進行拼接
file_path_li = os.path.join(r"C:\Users\logic\Desktop\mytest\file_dir",file_name)
# 讀取 excel 表格資料
all_data = pd.read_excel(file_path_li,sheet_name=None)
print(all_data)
--------------------------------------------------------------------
OrderedDict([('202001', 車牌號 駕駛員 起始公里 截至公里 里程數 加油金額 加油公升
0 鄂J0969 陳燕 186701.0 186935 234 267.07 32.41
1 鄂A25JL NaN NaN 0 0 NaN NaN
2 鄂A37NK 呂揚 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),...], ...)
從上打印出的結果(我取了第一個),會發現它的型別為 OrderedDict ,雖然組合起來好像不是很看得懂,但是分開來看,它的本質實際上是 Dict。所以實際上我們可以透過 202001 來獲取對應的資料值。如:
# 遍歷出每個檔名
for file_name in file_name_li:
# 將資料夾絕對路徑 與 檔名進行拼接
file_path_li = os.path.join(r"C:\Users\logic\Desktop\mytest\file_dir",file_name)
# 讀取 excel 表格資料
all_data = pd.read_excel(file_path_li,sheet_name=None)
print(all_data["202001"])
---------------------------------------------------------------------
車牌號 駕駛員 起始公里 截至公里 里程數 加油金額 加油公升
0 鄂J0969 陳燕 186701.0 186935 234 267.07 32.41
1 鄂A25JL NaN NaN 0 0 NaN NaN
2 鄂A37NK 呂揚 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
車牌號 駕駛員 起始公里 截至公里 里程數 加油金額 加油公升
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
從列印結果,可以發現,我們透過 202001 可以取到兩個工作簿中 202001 的資料,這是為什麼呢?傻瓜,因為迴圈呀~所以,現在我們就想,把資料都新增到一個列表中。除此之外,我們還需要工作表名來獲取資料,也就是將工作表名儲存到一個集合中(以便去重)。
# 定義檔名集合
all_file_name = set()
# 定義資料列表
all_data_li = []
# 遍歷出每個檔名
for file_name in file_name_li:
# 將資料夾絕對路徑 與 檔名進行拼接
file_path_li = os.path.join(r"C:\Users\logic\Desktop\mytest\file_dir",file_name)
# 讀取 excel 表格資料
all_data = pd.read_excel(file_path_li,sheet_name=None)
# 將資料新增到資料列表中
all_data_li.append(all_data)
# 將工作表名新增到資料夾集合中
for name in all_data:
all_file_name.add(name)
print(all_data_li)
print(all_file_name)
有了這些寶貝之後,我們就可以來實現非常關鍵的步驟了,也就是取出相同名稱的工作表進行拼接儲存到新的工作表中。
不過仍然要思考的是,我們怎麼使用 pandas 給一個工作簿中新增多個工作表呢?那就需要使用 pd.ExcelWriter了。程式碼如下:
# 建立工作簿
writer = pd.ExcelWriter("all_data.xlsx")
# 遍歷每個工作表名
for sheet_name in all_file_name:
data_li = []
# 遍歷資料
for data in all_data_li:
# 獲取同名數據並新增到data_li中
n_rows = data_li.append(data[sheet_name])
# 將同名數據進行拼接
group_data = pd.concat(data_li)
# 儲存到writer工作簿中,並指定工作表名為sheet_name
group_data.to_excel(writer,sheet_name=sheet_name)
# 千萬莫忘記,儲存工作簿
writer.save()
就醬,實現完畢啦~哈哈哈哈哈