多文件路径中的数据汇总

昨天接到一个小任务,数据量比较大的任务要拆分后跑同一个脚本,所以结果合并人工很困难(上百个文件)。现要将文件路径内的统计文件中对应的数据求和(比如所有的第一行第一列求和),记录一下我的方法:
本次任务中的被统计文件均同名(如果不同名需要同一种规则下的统计文件同名),因为格式化输出的,所以同一规则下同名也正常

首先,我们要获取路径树内所有的文件和文件夹(文件夹就行了)
#简单的递归,如果是文件夹就存到文件夹列表里然后将这一级的路径继续当做输入;文件就直接存

def get_file_path(root_path,file_list,dir_list):
    dir_or_files = os.listdir(root_path)
    for dir_file in dir_or_files:
        dir_file_path = os.path.join(root_path,dir_file)
        if os.path.isdir(dir_file_path):
            dir_list.append(dir_file_path)
            get_file_path(dir_file_path,file_list,dir_list)
        else:
            file_list.append(dir_file_path)

第二步就是要获取对应规则的路径,也很简单直接“==”对比或者正则

def get_regex(suffix,dirname):
    pattern='.+(%s)$' %suffix
    m=re.match(pattern,filename)
    return m         

如果满足条件了,就把对应路径下的文件存起来,依次类推就能获取所有文件了

filePath = os.path.join(get_regex(suffix, dirname).group(0), pivcked_fileName)

最后只要将结果累加就可以了

def get_suffix1_sum(inputLst):
	#假设只有需要被统计的只有两列(列太多了直接列表推导生成),col1存每个满足规则1的文件的第一列,同理col2
    col1 = []
    col2 = []
    for fl in inputLst:
        if os.path.exists(fl):
            data = pd.read_csv(fl).fillna('')
            count_lst = data.iloc[:,2]
            frequency_lst = data.iloc[:,3]
            col1.append(count_lst)
            col2.append(frequency_lst)
    sum_col1 = []
    sum_col2 = []
    #假设规则一中生成的文件统计量有10行
    for i in range(10):
    	#对每个文件的第一列的第i行数据相加
        sum1 = sum([int(col[i]) for col in col1])
        sum_col1.append(sum1)
        #对每个文件的第二列的第i行数据相加
        sum2 = sum([int(col[i]) for col in col2])
        sum_col2.append(sum2)
    print sum_col1
    print sum_col2
    #计算对应的频率
    per_lst = [str(round((float(i)/float(sum(sum_col2)))*100,5)) + '%' for i in sum_col2]
    print per_lst
    resultFile = ur'./stat.csv'
    #列太多了用dict(zip(col_names, cols))生成
    data = {'数量':sum_col1, '频次':sum_col2, '频次占比':per_lst}
    #转成dataframe直接输出
    df = pd.DataFrame(data)
    df.to_csv(resultFile,index=False)

人工可能1个多小时的工作量,2s做完,python大法好啊

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值