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中的hashlib和base64加密模块使用实例
Sep 02 Python
Python异常对代码运行性能的影响实例解析
Feb 08 Python
Python实现图片尺寸缩放脚本
Mar 10 Python
Tensorflow实现卷积神经网络的详细代码
May 24 Python
python3利用tcp实现文件夹远程传输
Jul 28 Python
说说如何遍历Python列表的方法示例
Feb 11 Python
Python中Numpy mat的使用详解
May 24 Python
解决python 读取 log日志的编码问题
Dec 24 Python
Python内置方法和属性应用:反射和单例(推荐)
Jun 19 Python
Python抖音快手代码舞(字符舞)的实现方法
Feb 07 Python
Matlab求解数组中的最大值及它所在的具体位置
Apr 16 Python
Python scrapy爬取起点中文网小说榜单
Jun 13 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 字符过滤类,用于过滤各类用户输入的数据
2009/05/27 PHP
两个php日期控制类实例
2014/12/09 PHP
Laravel框架中自定义模板指令总结
2017/12/17 PHP
JQuery打造PHP的AJAX表单提交实例
2009/11/03 Javascript
javascript Object与Function使用
2010/01/11 Javascript
js动态添加表格数据使用insertRow和insertCell实现
2014/05/22 Javascript
jQuery中:animated选择器用法实例
2014/12/29 Javascript
JS实现网站菜单拖拽移位效果的方法
2015/09/24 Javascript
JS实现左右无缝轮播图代码
2016/05/01 Javascript
JavaScript实现九九乘法表的简单实例
2016/06/07 Javascript
js Canvas实现圆形时钟教程
2016/09/19 Javascript
JavaScript实现星星等级评价功能
2017/03/22 Javascript
jQuery插件FusionCharts绘制的3D双柱状图效果示例【附demo源码】
2017/04/20 jQuery
Vue项目中使用better-scroll实现一个轮播图自动播放功能
2018/12/03 Javascript
vue用BMap百度地图实现即时搜索功能
2019/09/26 Javascript
Vue路由管理器Vue-router的使用方法详解
2020/02/05 Javascript
js+canvas实现简单扫雷小游戏
2021/01/22 Javascript
[02:54]辉夜杯主赛事第二日败者组 iG.V赛后采访
2015/12/26 DOTA
Python的多态性实例分析
2015/07/07 Python
Python优先队列实现方法示例
2017/09/21 Python
Python编程之基于概率论的分类方法:朴素贝叶斯
2017/11/11 Python
Django中使用第三方登录的示例代码
2018/08/20 Python
详解Selenium+PhantomJS+python简单实现爬虫的功能
2019/07/14 Python
python 项目目录结构设置
2020/02/14 Python
HTML5 Video标签的属性、方法和事件汇总介绍
2015/04/24 HTML / CSS
中国综合性网上购物商城:当当(网上卖书起家)
2016/11/16 全球购物
美国汽车零部件和配件网站:CarParts
2019/03/13 全球购物
实习单位推荐信范文
2013/11/27 职场文书
校园自助餐厅的创业计划书
2013/12/26 职场文书
电大本科自我鉴定
2014/02/05 职场文书
优秀医生事迹材料
2014/02/12 职场文书
开学典礼决心书
2014/03/11 职场文书
高中军训感言600字
2014/03/11 职场文书
幼儿园评语大全
2014/04/17 职场文书
预防艾滋病宣传标语
2014/06/25 职场文书
《赵州桥》教学反思
2016/02/17 职场文书