您的位置:首页技术文章
文章详情页

python 合并多个excel中同名的sheet

【字号: 日期:2022-06-29 13:15:03浏览:2作者:猪猪

大家好~ 老Amy来啦!已经n久没有给大家输出关于办公自动化的文章了…为什么呢?罗列原因:

太忙!(被领导“压榨”) 太忙!(没有额外的精力揣测大家办公的需求) 太忙!(持续吃瓜中)

然鹅,一位朋友的困惑成为了我这种“麻木状态”的终结者,他提出需求如下:

python 合并多个excel中同名的sheet

想不断尝试的老Amy,开启了思考模式:“我要怎么实现这个需求呢?”。

不用着急,首先我们来分析数据本身。

分析数据特征如下:

数据所在路径 C:UserslogicDesktopmytestfile_dir

python 合并多个excel中同名的sheet

data01.xlsx 数据如下:

python 合并多个excel中同名的sheet

data02.xlsx 数据如下:

python 合并多个excel中同名的sheet

由上可得信息如下:

所有 xlsx 工作簿都在同一个文件夹下 data01.xlsx 与 data02.xlsx 中 sheet 名相同的进行合并。也就是202001与202001合并,其它同理。

我们需要合并数据,首先需要读取到每个工作簿下每个工作表的数据,实现流程如下:

获取文件夹下所有工作簿名 拼接为绝对路径 读取所有表格数据 保存到空列表中

那要通过代码完成上面的连环操作,我们就需要使用到 python 中的内置模块 os 模块——与操作系统进行交互的模块,来获取文件夹下所有工作簿名,代码如下:

import os # 导入模块# 列出 C:UserslogicDesktopmytestfile_dir 下所有文件名file_name_li = os.listdir(r'C:UserslogicDesktopmytestfile_dir')file_name_li---------------------------------------------------------------------[’data01.xlsx’, ’data02.xlsx’]

但此时,无法只通过文件名去系统中找到对应的文件,所以我们需要更准确一点儿的地址——绝对路径,所以现在我们需要拼接每个文件的绝对路径。代码如下:

# 遍历出每个文件名for file_name in file_name_li: # 将文件夹绝对路径 与 文件名进行拼接 file_path_li = os.path.join(r'C:UserslogicDesktopmytestfile_dir',file_name) print(file_path_li) --------------------------------------------------------------------C:UserslogicDesktopmytestfile_dirdata01.xlsxC:UserslogicDesktopmytestfile_dirdata02.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:UserslogicDesktopmytestfile_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.411 鄂A25JL NaN NaN 0 0 NaN NaN2 鄂A37NK 吕扬 40283.0 40993 710 512.08 68.373 鄂A332B NaN NaN 0 0 NaN NaN4 鄂A3J78L 尚超 0.0 33 33 NaN NaN5 鄂A484ZF 鲁浩 50286.0 52574 2288 1340.84 191.456 鄂A620J 袁耀 41398.0 43604 2206 1579.69 225.677 鄂A7A8Z 志勇 41560.0 42883 1323 788.48 107.578 鄂AJ37Y 刘冲 0.0 73 73 NaN NaN9 鄂AD9251 毛义 3214.0 3349 135 NaN NaN10 鄂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:UserslogicDesktopmytestfile_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.411 鄂A25JL NaN NaN 0 0 NaN NaN2 鄂A37NK 吕扬 40283.0 40993 710 512.08 68.373 鄂A332B NaN NaN 0 0 NaN NaN4 鄂A3J78L 尚超 0.0 33 33 NaN NaN5 鄂A484ZF 鲁浩 50286.0 52574 2288 1340.84 191.456 鄂A620J 袁耀 41398.0 43604 2206 1579.69 225.677 鄂A7A8Z 志勇 41560.0 42883 1323 788.48 107.578 鄂AJ37Y 刘冲 0.0 73 73 NaN NaN9 鄂AD9251 毛义 3214.0 3349 135 NaN NaN10 鄂AD2192 赵敏 434.0 796 362 NaN NaN 车牌号 驾驶员 起始公里 截至公里 里程数 加油金额 加油公升0 鄂J0039 周鹏 15512 15512 0 NaN NaN1 鄂J0021 王林 7790 7790 0 NaN NaN2 鄂J0022 徐涛 373505 373505 0 NaN NaN3 鄂J0079 赵舟 431169 431169 0 NaN NaN4 鄂J0018 郭鹰 3635 3635 0 NaN NaN5 鄂J0808 周尊 257743 257743 0 NaN NaN6 鄂J01X3 胡志 72000 72150 150 159.26 25.167 鄂J01X0 吴军 73031 73568 537 393.46 58.128 鄂J0F12 宋安 149017 149050 33 0.00 0.009 鄂J0F52 金煜 150617 150617 0 NaN NaN10 鄂J0272 刘兵 58124 58305 181 0.00 0.0011 鄂J02F2 胡飞 169665 169665 0 NaN NaN12 鄂J0292 王勇 111625 113121 1496 1081.37 156.5413 鄂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:UserslogicDesktopmytestfile_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()

python 合并多个excel中同名的sheet

就酱,实现完毕啦~哈哈哈哈哈

以上就是python 合并多个excel中同名的sheet的详细内容,更多关于python 合并excel中的sheet的资料请关注好吧啦网其它相关文章!

标签: python
相关文章: