大家好~ 老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()
就酱,实现完毕啦~哈哈哈哈哈
以上就是python 合并多个excel中同名的sheet的详细内容,更多关于python 合并excel中的sheet的资料请关注其它相关文章!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 中国武警男声合唱团《辉煌之声1天路》[DTS-WAV分轨]
- 紫薇《旧曲新韵》[320K/MP3][175.29MB]
- 紫薇《旧曲新韵》[FLAC/分轨][550.18MB]
- 周深《反深代词》[先听版][320K/MP3][72.71MB]
- 李佳薇.2024-会发光的【黑籁音乐】【FLAC分轨】
- 后弦.2012-很有爱【天浩盛世】【WAV+CUE】
- 林俊吉.2012-将你惜命命【美华】【WAV+CUE】
- 晓雅《分享》DTS-WAV
- 黑鸭子2008-飞歌[首版][WAV+CUE]
- 黄乙玲1989-水泼落地难收回[日本天龙版][WAV+CUE]
- 周深《反深代词》[先听版][FLAC/分轨][310.97MB]
- 姜育恒1984《什么时候·串起又散落》台湾复刻版[WAV+CUE][1G]
- 那英《如今》引进版[WAV+CUE][1G]
- 蔡幸娟.1991-真的让我爱你吗【飞碟】【WAV+CUE】
- 群星.2024-好团圆电视剧原声带【TME】【FLAC分轨】