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代码 if not x: 和 if x is not None: 和 if not x is None:使用介绍
Sep 21 Python
Pyinstaller将py打包成exe的实例
Mar 31 Python
python读取图片并修改格式与大小的方法
Jul 24 Python
浅谈pycharm下找不到sqlalchemy的问题
Dec 03 Python
PyQt5+Caffe+Opencv搭建人脸识别登录界面
Aug 28 Python
python实现LRU热点缓存及原理
Oct 29 Python
Django choices下拉列表绑定实例
Mar 13 Python
Python实现AI换脸功能
Apr 10 Python
python:HDF和CSV存储优劣对比分析
Jun 08 Python
一文读懂Python 枚举
Aug 25 Python
python用tkinter实现一个简易能进行随机点名的界面
Sep 27 Python
详解Python遍历列表时删除元素的正确做法
Jan 07 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 高手之路(一)
2006/10/09 PHP
获得Google PR值的PHP代码
2007/01/28 PHP
通过dbi使用perl连接mysql数据库的方法
2014/04/16 PHP
PHP SPL标准库之数据结构栈(SplStack)介绍
2015/05/12 PHP
PHP时间类完整实例(非常实用)
2015/12/25 PHP
Yii框架引入coreseek分页功能示例
2019/02/08 PHP
laravel实现前后台路由分离的方法
2019/10/13 PHP
javascript实现的在当前窗口中漂浮框的代码
2010/03/15 Javascript
jquery实现横向图片轮播特效代码分享
2015/11/19 Javascript
javascript实现用户点击数量统计
2016/12/25 Javascript
JavaScript中undefined和null的区别
2017/05/03 Javascript
Angular开发实践之服务端渲染
2018/03/29 Javascript
iview同时验证多个表单问题总结
2018/09/29 Javascript
layui自定义ajax左侧三级菜单
2019/07/26 Javascript
Vue实现星级评价效果实例详解
2019/12/30 Javascript
解决vue elementUI中table里数字、字母、中文混合排序问题
2020/01/07 Javascript
vue页面更新patch的实现示例
2020/03/25 Javascript
vue父子组件间引用之$parent、$children
2020/05/20 Javascript
探究一道价值25k的蚂蚁金服异步串行面试题
2020/08/21 Javascript
python多维数组切片方法
2018/04/13 Python
PyCharm中代码字体大小调整方法
2019/07/29 Python
Django rstful登陆认证并检查session是否过期代码实例
2019/08/13 Python
Python用类实现扑克牌发牌的示例代码
2020/06/01 Python
Python修改DBF文件指定列
2020/12/19 Python
在css3中background-clip属性与background-origin属性的用法介绍
2012/11/13 HTML / CSS
解释一下钝化(Swap out)
2016/12/26 面试题
remote接口和home接口主要作用
2013/05/15 面试题
个人自我鉴定怎么写
2013/10/28 职场文书
2015年大学学生会工作总结
2015/05/13 职场文书
观看焦裕禄观后感
2015/06/09 职场文书
公司档案管理制度
2015/08/05 职场文书
入党后的感想
2015/08/10 职场文书
校园音乐节目广播稿
2015/08/19 职场文书
2015质检员个人年终工作总结
2015/10/23 职场文书
Python中Selenium对Cookie的操作方法
2021/07/09 Python
python字符串的一些常见实用操作
2022/04/06 Python