让python助力N个excel文件指定列批量求和!

事情是这样的由于某个特别的项目在做立项调研,需要统计下各个分店(差点100家分店)的会员资产情况,任务是需要2天内完成。原计划是用1天来收集分店上传的资料,实际上最后只有80%的门店按时上传了,其他门店到第二天下午专门催了才上交。哎,有什么办法呢分店会员数据都是单机服务器存储的,人家自己也有工作要做。不过——从敲定需要这个统计数据开始,第一时间就想到了能不能用python来处理!这样最多花一天的时间来写脚本并完善,第二天直接跑已经上传资料的excel遇到问题就直接优化再说,我可不想浪费时间在这种重复且无意义的excel操作上……

一、需要python实现的功能需求

1、遍历获取指定文件夹以及子文件夹下面所有的excel文件(为了方便会把收集的excel全部放到一个文件夹下)

2、循环处理每个遍历获取到的excel,使用pandas模块来对指定名称的列进行求和,每个excel得到求和结果时同时追加存入一个excel结果表

3、为了减少代码逻辑遇到多个sheet的需要报错提示,以及一些其他错误判断提示

4、通过最终的excel结果表可以看到各个excel自己求和的数据,如果要看全国总数据的话就在结果表列求和即可,懒得把这逻辑写python代码里了。

二、没错,就是如此简单的python

里面还在结果表存了excel的文件名、以及行数,一般文件名是按门店名字命名的如果后面老板想看各门店的情况直接看就可以了,还有行数的目的是如果发现接近65536行的excel需要单独确认下分店上交的数据是否完整,因为据了解客户机导出时是xls文件,如果会员数据超过65536行 分店系统只能导出前面的数据,但是不会程序报错提示,有些分店会注意不到这个细节(虽然下发操作指导文件时专门贴图说了这个事,但 木有用~~)

import pandas as pd
import os
from pandas import DataFrame

#基本函数( 取所有文件夹下所有子文件)
def show_files(path, all_files=[]):# 首先遍历当前目录所有文件及文件夹
    file_list = os.listdir(path)# 准备循环判断每个元素是否是文件夹还是文件,是文件的话,把名称传入list,是文件夹的话,递归
    #print(file_list)
    for file in file_list:# 利用os.path.join()方法取得路径全名,并存入cur_path变量,否则每次只能遍历一层目录
        cur_path = os.path.join(path, file)# 判断是否是文件夹
        if os.path.isdir(cur_path):
            show_files(cur_path, all_files)
        else:
            all_files.append(cur_path)
            #print(cur_path)
    return all_files

def rename_files(path):
    pass


def calc_leager(files):#根据提供的excel文件list,求和
    data={'文件':[],'excel行数':[],'币数':[],'票数':[],'成长值':[]}
    res=[]
    rows=0
    for file in files:
        if '.xls' in file or '.xlsx' in file:
            try:
                df = pd.read_excel(file,sheet_name=1)
                print('【已跳过,文件存在多个sheet 需要人工处理】'+file)
                continue
            except Exception as e:
                pass
            try:
                df = pd.read_excel(file,sheet_name=0)  # 读取Excel表格,并转为DataFrame格式
            except Exception as e:
                print('【文件读取失败跳过】'+file)
                print(e)
                sys.exit()
            #sum_of_a = df["V"].sum()  # 对"A"列的数据求和
            #sum_of_a = df['col22'].sum() 
            try:
                sumi = df[['币数','票数','成长值']].sum() #excel对应的列的表头名字
                newstr=file.replace(' ','')+'   币数   '+str(sumi[0])+'   票数   '+str(sumi['票数'])+'   成长值   '+str(sumi[2])
                res.append(newstr)
                rows=rows+1
                data['文件'].append(file.replace(' ',''))
                data['excel行数'].append(len(df))
                data['币数'].append(sumi[0])
                data['票数'].append(sumi[1])
                data['成长值'].append(sumi[2])

            except Exception as e:
                print('【文件操作失败跳过】'+file)
                print(e)
    a= pd.DataFrame(data)
    a.to_excel('1.xlsx', sheet_name='Sheet1',index=False)# index = False表示不写入索引
    return res


#当前文件的工作目录
path =os.getcwd()
r=calc_leager(show_files(path,all_files=[]))
print('='*100)
for i in r:
    print(i)

三、excel文件参考格式

会员号码币数票数成长值
hy0011002000
hy00705552

最终将近100家分店的数据计算跑了十几分钟,如果下次还有这种需求,可以泡杯咖啡小憩一下了~有些事还真不好说按部就班加班加点去完成好呢还是写个脚本duang一下好呢? 也许老板更喜欢前者吧!

如果遇到了UnicodeDecodeError: ‘utf-16-le’ codec can’t decode bytes这种报错,可能是客户软件导出的excel存在某些结构不完整导致,可以尝试全选excel内容复制到一个空白的excel里面保存。可参考我之前的这篇文章:python读取excel报错

基于互联网精神,在注明出处的前提下本站文章可自由转载!

本文链接:https://ranjuan.cn/python-excel-sum-columns/

赞赏

微信赞赏支付宝赞赏

发表评论