当前位置:   article > 正文

Python自动化小技巧10——excel文件批量多sheet表合并_python将多个sheet合成一个

python将多个sheet合成一个

本次案例背景是博主之前实习时遇到的问题,就是有很多个excel表:

 每个工作簿里面又有很多sheet子表:

 想要把这些子表合并在一起,多个excel工作簿也要合并到一起,手工肯定慢,这种重复性的劳动交给代码脚本是最合适了。

思路大概就是两个循环,第一个循环文件夹下的不同excel工作簿,第二个循环同一个excel文件里面的不同sheet子表,一一合并就行。


代码基础:

首先我们看看怎么获取excel表里面的所有sheet名称。

  1. import pandas as pd
  2. df = pd.ExcelFile('test1.xlsx')
  3. print(df.sheet_names) # 查看所有sheet 名字

 成功获取!

pandas库在处理各种形式的数据文件都还是很好用的。

如果只有一个excel工作簿多sheet合并可以用这个列表解析式来写:

  1. df_concat= pd.concat([ pd.read_excel(df, sheet) for sheet in df.sheet_names])
  2. #将所有sheet中数据合并到一个df中

但是我们有很多个excel工作簿,而且每个工作簿的子表sheet情况都不太一样,所以我下面手写两层循环,加了一点条件判断,进行数据合并。 


所有表格合并:

  1. import pandas as pd
  2. #开始合并
  3. test_df=pd.DataFrame() #创建一个空数据框
  4. for j in range(1,6): #文件个数
  5. df = pd.ExcelFile('test%d.xlsx'%j)
  6. for sheet in df.sheet_names:
  7. row_df = pd.read_excel('test%d.xlsx'%j, sheet)
  8. if not int(row_df.size) > 0: # 空白内容
  9. continue
  10. else: # 有内容
  11. test_df = pd.concat([test_df, row_df], axis=0) # 合并
  12. test_df['序号'] = test_df.index + 1
  13. print('已经合并到第%d个'%j)
  14. print('合并完成')
  15. test_df.to_excel('合并数据.xlsx',index=False)

整体思路就是先创建一个空的数据框,然后循环文件个数,我的文件都是用test来命名,后面加数字表示顺序。我这里5个文件,所以循环从(1,6)。然后获取每个excel工作簿里面的sheet子表名称的列表,然后一一读取,判断是否为空。因为我的sheet表里面有空白的情况,所以加了一个条件判断,不为空白才进行合并。合并进入test_df里面。最后储存。

这里使用的是concat合并方法,就是如果每个sheet表里面的列名称对不上的话,它会自动判断,如果两个数据框的列名称是一样的,就把内容追加到后面,列名称不一样的就新增一列,没有的列就为空值。

这个方法就很稳健,表格名称不一样都不会报错。

运行结果:

最后就生成一个总文件就完成了:

 里面就有所有的数据。


写入不同的sheet表

有的同学会问我不想写入一个表里面,我要写入excel里面不同的sheet表,那应该怎么操作呢:

  1. import pandas as pd
  2. writer = pd.ExcelWriter('多sheet表.xlsx')
  3. df1.to_excel(writer,sheet_name='AAA')
  4. df2.to_excel(writer,sheet_name='BBB')

使用pd的ExcelWriter对象就行,将自己想写的数据框一个个存入不同的sheet表里面。


更新:

目录下所有execl表合并

有同学最近问我,如果文件夹里面的excel表没有像我上面这样名称这么规范,怎么快速读取呢,也有办法,使用glob包:

  1. import numpy as np
  2. import pandas as pd
  3. import glob
  4. files=glob.glob('./*.xlsx')
  5. files

可以找到该目录下的xlsx文件。同理,找到word或者ppt也是可以的。

然后一行代码读取所有excel文件,并且合并,修改名称:

  1. Battery_list = ['CS2_35', 'CS2_36', 'CS2_37', 'CS2_38']
  2. Battery=pd.concat([pd.read_excel(i,usecols=['capacity']) for i in files],axis=1).set_axis(Battery_list,axis=1)
  3. Battery.head()

 

 是不是很简洁方便?

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/317970?site
推荐阅读
相关标签
  

闽ICP备14008679号