大家好~老Amy来啦!已经n久没有给大家输出关于办公自动化的文章了...为什么呢?罗列原因:
太忙!(被领导“压榨”)
太忙!(没有额外的精力揣测大家办公的需求)
太忙!(持续吃瓜中)
然鹅,一位朋友的困惑成为了我这种“麻木状态”的终结者,他提出需求如下:
想不断尝试的老Amy,开启了思考模式:“我要怎么实现这个需求呢?”。
不用着急,首先我们来分析数据本身。
分析数据特征如下:
数据所在路径C:\Users\logic\Desktop\mytest\file_dir
data01.xlsx数据如下:
data02.xlsx数据如下:
由上可得信息如下:
所有xlsx工作簿都在同一个文件夹下
data01.xlsx与data02.xlsx中sheet名相同的进行合并。也就是与合并,其它同理。
我们需要合并数据,首先需要读取到每个工作簿下每个工作表的数据,实现流程如下:
获取文件夹下所有工作簿名
拼接为绝对路径
读取所有表格数据
保存到空列表中
那要通过代码完成上面的连环操作,我们就需要使用到python中的内置模块os模块——与操作系统进行交互的模块,来获取文件夹下所有工作簿名,代码如下:
importos#导入模块#列出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]
但此时,无法只通过文件名去系统中找到对应的文件,所以我们需要更准确一点儿的地址——绝对路径,所以现在我们需要拼接每个文件的绝对路径。代码如下:
#遍历出每个文件名forfile_nameinfile_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.xlsxC:\Users\logic\Desktop\mytest\file_dir\data02.xlsx
有了文件的绝对路径后,我们就可以来读取文件中的数据,那就要使用到法宝pandas了。首先大家注意,pandas并不是python的内置模块,而是需要我们去安装的。然后使用pandas的read_excel()方法读取数据,但是需要注意的是,此时我们需要读取的是工作簿下的所有工作表,所以需要指定sheet_name为None,否则会默认读取第一个工作表。代码如下:
#遍历出每个文件名forfile_nameinfile_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([(,车牌号驾驶员起始公里截至公里里程数加油金额加油公升0鄂J陈燕.7..鄂A25JLNaNNaN00NaNNaN2鄂A37NK吕扬...鄂ABNaNNaN00NaNNaN4鄂A3J78L尚超0.NaNNaN5鄂AZF鲁浩.40..鄂AJ袁耀.79..鄂A7A8Z志勇.8..鄂AJ37Y刘冲0.07NaNNaN9鄂AD毛义.NaNNaN10鄂AD赵敏.NaNNaN),...],...)
从上打印出的结果(我取了第一个),会发现它的类型为OrderedDict,虽然组合起来好像不是很看得懂,但是分开来看,它的本质实际上是Dict。所以实际上我们可以通过来获取对应的数据值。如:
#遍历出每个文件名forfile_nameinfile_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[""])---------------------------------------------------------------------车牌号驾驶员起始公里截至公里里程数加油金额加油公升0鄂J陈燕.7..鄂A25JLNaNNaN00NaNNaN2鄂A37NK吕扬...鄂ABNaNNaN00NaNNaN4鄂A3J78L尚超0.NaNNaN5鄂AZF鲁浩.40..鄂AJ袁耀.79..鄂A7A8Z志勇.8..鄂AJ37Y刘冲0.07NaNNaN9鄂AD毛义.NaNNaN10鄂AD赵敏.NaNNaN车牌号驾驶员起始公里截至公里里程数加油金额加油公升0鄂J周鹏NaNNaN1鄂J王林NaNNaN2鄂J徐涛5055050NaNNaN3鄂J赵舟0NaNNaN4鄂J郭鹰NaNNaN5鄂J周尊0NaNNaN6鄂J01X3胡志..鄂J01X0吴军7303173568593..鄂J0F12宋安..鄂J0F52金煜0NaNNaN10鄂J刘兵10..鄂J02F2胡飞0NaNNaN12鄂J王勇..鄂J05R0刘金NaNNaN
从打印结果,可以发现,我们通过可以取到两个工作簿中的数据,这是为什么呢?傻瓜,因为循环呀~所以,现在我们就想,把数据都添加到一个列表中。除此之外,我们还需要工作表名来获取数据,也就是将工作表名保存到一个集合中(以便去重)。
#定义文件名集合all_file_name=set()#定义数据列表all_data_li=[]#遍历出每个文件名forfile_nameinfile_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)#将工作表名添加到文件夹集合中fornameinall_data:all_file_name.add(name)print(all_data_li)print(all_file_name)
有了这些宝贝之后,我们就可以来实现非常关键的步骤了,也就是取出相同名称的工作表进行拼接保存到新的工作表中。
不过仍然要思考的是,我们怎么使用pandas给一个工作簿中添加多个工作表呢?那就需要使用pd.ExcelWriter了。代码如下:
#创建工作簿writer=pd.ExcelWriter("all_data.xlsx")#遍历每个工作表名forsheet_nameinall_file_name:data_li=[]#遍历数据fordatainall_data_li:#获取同名数据并添加到data_li中n_rows=data_li.append(data[sheet_name])#将同名数据进行拼接group_data=pd.concat(data_li)#保存到writer工作簿中,并指定工作表名为sheet_namegroup_data.to_excel(writer,sheet_name=sheet_name)#千万莫忘记,保存工作簿writer.save()
就酱,实现完毕啦~哈哈哈哈哈
预览时标签不可点收录于话题#个上一篇下一篇