python-合并Excel文件-上百个不同文件夹下Excel-处理过程超多


      更多关于Python的知识请加关注哟~~。若需联系博主请私信或者加博主联系方式:
      QQ:1542334210
      微信公众号:不一样的数据分析
      微信号:ZDSL1542334210

在这里插入图片描述

更多精彩内容请关注微信公众:不一样的数据分析

前言:

         T_T最近离职了,重新找工作中,所以有时间来更新文章T_T,那么今天来个重头戏,就是利用python批量合并excel文件。我们在工作中,避不了有这样的情况,就是老板让你把历史以来的订单数据或者日常报单数据合并为一个excel文档方便入库,这些数据每天都会产生一张表格,如果刚好是一个月的,你可能复制粘贴,但是如果是2020整年呢?现在日期是2020.06.24,那么总共有31+29+31+30+31+24=176张excel表格…我想说的是,我写了一个合并excel的脚本,你慢慢复制吧,我去看会电影…
         当然我们上面仅仅是不到6个月的数据,如果是几年的数据那么基本上就不用做了,直接把电脑砸了吧!

1、今天的excel数据

         不得不说,我这个案例是比较难的,如果python基础不太好的同学,建议【关注我的博客和微信公众号一波,后期我将会写出python基础教程,敬请关注!】不过呢认真练习和阅读你会发现,并不是那么难。你操作操作也能上手。

1.1、数据展示

         这是数据存放文件夹,这里有4个月数据的文件夹,每个月份对应文件下又有对应天数个excel数据文件。
在这里插入图片描述
         这是展示一月份的文件夹,对应有31个数据文件
在这里插入图片描述
         随便打开一个表格看看,每个表格大概有50多条数据,而且我们只要"报单明细"这个标签表(这里我增加了难度,故意空出一行和多个缺失值与空值,为的就是能够处理更加复杂的问题,把一些"捣乱"的因素考虑进去)
在这里插入图片描述

2、合并思路分析

         首先必须明确,要想合并这些表格,肯定会使用到循环,我们的步骤是这样的(如果单是训练技术,请重点看步骤3,如果未满18岁请在父母陪同下观看,较为血腥暴力):
         1、获取"每日数据"文件夹下的所有文件夹名,目的是为了用其拼接出每月的数据存放路径;
         2、用步骤1得到的各月数据存放路径获取该月各日的数据文件路径;
         3、利用循环将步骤2中的表格挨个合并(纵向拼接,该步骤是最复杂的)圈下来,要考的!
         4*、这里主要是要考虑设置一些代码块作为提示-- 比如,我们的数据是每天都有一份,那万一数据少了一天或几天的数据呢?再比如,我们需要设置一个时间预测,就是预计合并需要多长时间,这样方便监控(数据越多越有必要)!

3、步入代码
3.1、导入模块

         导入模块

import pandas as pd
import os
import warnings     # 警告模块
import numpy as np
import time
import datetime
3.2、解决思路步骤4*

         这里要作准备工作,需要计算我们现存文件夹下有多少个excel数据文件与实际应该有多少个。那么怎么计算呢?
         首先现存文件夹下共有多少excel数据文件计算方法就是获取每个月份文件夹下的所有excel数据进行求和,代码为

path='D:/zhuge/每日数据/' #数据存放路径
filenames = os.listdir(path)
file=[path+i for i in filenames] #列表推导式
for i in file:
    len1=len(os.listdir(i))
    fillen=fillen+len1  #得到现存的文件个数 这里是121个

         再次就是按照日期实际上应有的文件个数,这里我的思路是这样的(方法有很多,这里仅供参考,欢迎大家自行发挥并留言,我们一起讨论),我获取一月份文件夹下第一个excel文件且获得对应时间,记为,再获取四月份文件夹下最后一个excel文件获得对应时间,记为endyear,然后让两个时间作差取天数,这样就得按照日期实际上应该有多少excel文件,最后利用endyear-bgyear就得到我们少了多少文件或者多了多少文件,无论少或者多都是错的,所以要排除这可能,相等时才合并。这样作差的好处是计算精确,因为最近一个月总是不足对应月份天数的,所以不能直接用月份对应天数相加。这样代码为:

bgyear=os.listdir(file[0])[0][0:10].replace('.','-') #用replace函数是因为之前文件命名为"2020.01.01"将其修改为"2020-01-01"
endyear=os.listdir(file[len(file)-1])[len(os.listdir(file[len(file)-1]))-1][0:10].replace('.','-')
trueday=datetime.datetime.strptime(endyear,'%Y-%m-%d')-datetime.datetime.strptime(bgyear,'%Y-%m-%d')
truefil=trueday.days+1
  # 这里加1是因为两个日期相减会少一天,我们将其补回来。部分同学可能不太清楚
  #举例:1号到6号,6-1=5天,但实际上我们是算6天,因为作差,缺失了一天
print("按日期实际应有的文件个数为:"+str(truefil))
3.3、解决空、缺失值以保提取完整数据

         我们对初始的数据可以看到,有大量的空值和 缺失值需要处理,那么我的方式就是:1、先提取“报单明细”标签表;2、删除第一行空值;3、根据姓名列,找到最后一个为空的单元格位置,将中间的所有行数提取出来;4、日期就以对应文件名称为准(这是因为表格中文件填写的日期是不准确的,故采用对应文件名称),具体代码实现为:

# 该部分代码需要结合总主函数进行观看,如有不懂得伙伴可加关注在微信公众号留言私聊我
for filename in filenames:
    paths=path+filename+'/'
    excelnam = os.listdir(paths)
    for i in excelnam:
        data=i[0:10].replace('.','-')
        print("正在合并日期 {} 数据".format(data))
        df=''
        df = pd.read_excel(paths+i,sheet_name='报单明细')
        df=df.iloc[:,0:8]
        df.columns = ['序列', '日期', '部门', '来源','姓名','业绩','小组','求和']
        df1=df.drop([0])   #删除第一行
        df1['日期']=data
        df1=df1.reset_index(drop=True)   #重置索引
        Notnaem=np.where(df1['姓名'].notnull())[0][0]
        df2=df1.drop([i for i in range(Notnaem)])
        df3=df2.reset_index(drop=True)
        NAnaem=np.where(df3['姓名'].isnull())[0][0]
3.4、合并表格与其他提醒控制语句

         每当数据提取出来后,我们使用pd.concat()将数据截着拼接上即可,当然其他控制就是通过提示打印出合并过程中的具体步骤了,难度并不是很大。

# 此步骤为上一步的后续,需要结合一起看。
  df4[["业绩"]] = df4[["业绩"]].astype(float)
  df4['求和']=sum(df4['业绩'])
  df4['序列']=[i for i in range(1,len(df4)+1)]
  df5=pd.concat([df5,df4])
# 提醒类控制语句
print('='*10+'恭喜!共{}日数据合并完成,耗时:{}秒'.format(fillen,round(time2-time1,3)))
print('Error'+'*'*3+' '*20+'合并失败!'+' '*20+'*'*3+'Error')
print('Error'+'*'*3+'文件个数有误,有累积%s天数据未放入指定文件夹下'%(truefil-fillen)+'*'*3+'Error')
print('Error'+'*'*3+' '*13+'请检查数据文件天数!'+' '*13+'*'*3+'Error')
4、主函数

         主函数部分就是.py文件放到任一文件夹下[当然注意你数据存放类型和位置是否对],我一般是利用cmd命令来执行.py文件,当然了我们函数中已经将存放路径写为默认的了。

import pandas as pd
import os
import warnings
import numpy as np
import time
import datetime

warnings.filterwarnings("ignore")
pat='./'   #保存合并完成的路径
path='D:/zhuge/每日数据/' #合并报单存放路径
filenames = os.listdir(path)
file=[path+i for i in filenames]
bgyear=os.listdir(file[0])[0][0:10].replace('.','-')
endyear=os.listdir(file[len(file)-1])[len(os.listdir(file[len(file)-1]))-1][0:10].replace('.','-')
print("开始时间为:"+bgyear)
print("结束时间为:"+endyear)
trueday=datetime.datetime.strptime(endyear,'%Y-%m-%d')-datetime.datetime.strptime(bgyear,'%Y-%m-%d')
truefil=trueday.days+1
print("应有的文件个数为:"+str(truefil))
fillen=0
for i in file:
    len1=len(os.listdir(i))
    fillen=fillen+len1
print("现存的文件个数为:"+str(fillen))
if truefil==fillen:
    print('='*10+'共计%s个数据文件'%(fillen))
    print('='*10+'开始合并数据日期范围:%s-%s'%(bgyear,endyear))
    print('='*10+'数据合并中,请稍后...')
    print('='*10+'预计耗时:%s秒'%(round(fillen*0.26,3)))
    df5=pd.DataFrame()
    time1=time.time()
    for filename in filenames:
        paths=path+filename+'/'
        excelnam = os.listdir(paths)
        for i in excelnam:
            data=i[0:10].replace('.','-')
            print("正在合并日期 {} 数据".format(data))
            df=''
            df = pd.read_excel(paths+i,sheet_name='报单明细')
            df=df.iloc[:,0:8]
            df.columns = ['序列', '日期', '部门', '来源','姓名','业绩','小组','求和']
            df1=df.drop([0])   #删除第一行
            df1['日期']=data
            df1=df1.reset_index(drop=True)   #重置索引
            Notnaem=np.where(df1['姓名'].notnull())[0][0]
            df2=df1.drop([i for i in range(Notnaem)])
            df3=df2.reset_index(drop=True)
            NAnaem=np.where(df3['姓名'].isnull())[0][0]
            df4=df3[0:NAnaem]
            df4[["业绩"]] = df4[["业绩"]].astype(float)
            df4['求和']=sum(df4['业绩'])
            df4['序列']=[i for i in range(1,len(df4)+1)]
            df5=pd.concat([df5,df4])
        df5.to_excel(pat+"数据合并(%s-%s).xlsx"%(bgyear,endyear), index=False)
    time2=time.time()
    print('='*10+'恭喜!共{}日数据合并完成,耗时:{}秒'.format(fillen,round(time2-time1,3)))
else:
    print('Error'+'*'*3+' '*20+'合并失败!'+' '*20+'*'*3+'Error')
    print('Error'+'*'*3+'文件个数有误,有累积%s天数据未放入指定文件夹下'%(truefil-fillen)+'*'*3+'Error')
    print('Error'+'*'*3+' '*13+'请检查数据文件天数!'+' '*13+'*'*3+'Error')

         来吧展示心在跳爱在烧…
在这里插入图片描述
在这里插入图片描述

5、结语

         本案例是合并excel的具体实列,主要为了体现python自动化操作的便捷和快速。如有问题或是小伙伴们有需要我帮合并的欢迎关注我微信公众号【扫描下方二维码】并留言,博主会在两个工作日内回复,若未回复请加博主微信:ZDSL1542334210.
在这里插入图片描述

6、文末彩蛋–开心一刻

         这不是前不久我熊哥结婚了,恰好我们公司王总也是结婚了,他俩上班就经常在一起交流结婚后的心得体会。王总说:“我老婆可能到了更年期了,特别健忘,经常是提着菜刀还满屋子找菜刀,有的时候我真受不了她。结果这时候我熊哥说到:“你的处境比我好多了,我老婆经常是提着菜刀满屋子找我。”就是这么个情况嘛。

请扫码关注我微信公众号和相关渠道信息~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值