python 合并多个excel中同名的sheet


Posted in Python onJanuary 22, 2021

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

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

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

python 合并多个excel中同名的sheet

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

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

分析数据特征如下:

数据所在路径 C:\Users\logic\Desktop\mytest\file_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:\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()

python 合并多个excel中同名的sheet

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

以上就是python 合并多个excel中同名的sheet的详细内容,更多关于python 合并excel中的sheet的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python原始套接字编程示例分享
Feb 21 Python
Python中的anydbm模版和shelve模版使用指南
Jul 09 Python
Python中查看文件名和文件路径
Mar 31 Python
python验证码识别实例代码
Feb 03 Python
Python读取本地文件并解析网页元素的方法
May 21 Python
python批量创建指定名称的文件夹
Mar 21 Python
python logging模块的使用总结
Jul 09 Python
Python使用贪婪算法解决问题
Oct 22 Python
利用Python校准本地时间的方法教程
Oct 31 Python
浅谈Tensorflow 动态双向RNN的输出问题
Jan 20 Python
python中使用you-get库批量在线下载bilibili视频的教程
Mar 10 Python
conda安装tensorflow和conda常用命令小结
Feb 20 Python
Python读取pdf表格写入excel的方法
Jan 22 #Python
python 基于UDP协议套接字通信的实现
Jan 22 #Python
详解matplotlib中pyplot和面向对象两种绘图模式之间的关系
Jan 22 #Python
Jmeter调用Python脚本实现参数互相传递的实现
Jan 22 #Python
Python实现王者荣耀自动刷金币的完整步骤
Jan 22 #Python
python实现马丁策略回测3000只股票的实例代码
Jan 22 #Python
Python爬虫回测股票的实例讲解
Jan 22 #Python
You might like
php adodb操作mysql数据库
2009/03/19 PHP
色色整理的PHP面试题集锦
2012/03/08 PHP
用PHP+MySQL搭建聊天室功能实例代码
2012/08/20 PHP
php class中self,parent,this的区别以及实例介绍
2013/04/24 PHP
解析isset与is_null的区别
2013/08/09 PHP
php实现httpclient类示例
2014/04/08 PHP
PHP将进程作为守护进程的方法
2015/03/19 PHP
PHP的简单跳转提示的实现详解
2019/03/14 PHP
jquery下动态显示jqGrid以及jqGrid的属性设置容易出现问题的解决方法
2010/10/22 Javascript
jquery.post用法示例代码
2014/01/03 Javascript
JavaScript中常见的字符串操作函数及用法汇总
2015/05/04 Javascript
使用AngularJS创建单页应用的编程指引
2015/06/19 Javascript
Jquery zTree 树控件异步加载操作
2016/02/25 Javascript
学习使用jquery iScroll.js移动端滚动条插件
2020/03/24 Javascript
JS实现动态表格的添加,修改,删除功能(推荐)
2016/06/15 Javascript
React Router基础使用
2017/01/17 Javascript
node.js基于mongodb的搜索分页示例
2017/01/22 Javascript
Bootstrap学习笔记之进度条、媒体对象实例详解
2017/03/09 Javascript
微信小程序 跳转传参数与传对象详解及实例代码
2017/03/14 Javascript
Vue实现动态显示textarea剩余字数
2017/05/22 Javascript
三分钟学会用ES7中的Async/Await进行异步编程
2018/06/14 Javascript
Python元组拆包和具名元组解析实例详解
2018/03/26 Python
python实现决策树分类
2018/08/30 Python
python 产生token及token验证的方法
2018/12/26 Python
使用Python实现跳帧截取视频帧
2019/05/31 Python
Django配置文件代码说明
2019/12/04 Python
Python使用paramiko连接远程服务器执行Shell命令的实现
2021/03/04 Python
HTML5 用动画的表现形式装载图像
2016/03/08 HTML / CSS
Booking.com荷兰:全球酒店网上预订
2017/08/22 全球购物
中兴通讯全球官方网站:ZTE
2020/12/26 全球购物
山海经纬软件测试笔试题和面试题
2013/04/02 面试题
淘宝店策划方案
2014/06/07 职场文书
乡镇综治宣传月活动总结
2014/07/02 职场文书
建筑工程材料员岗位职责
2015/04/11 职场文书
感恩老师主题班会
2015/08/12 职场文书
公文写作指导之倡议书!
2019/07/03 职场文书