01.一个自动合并多个excel表(非多工作簿)的工具

01.一个自动合并多个excel(非多工作簿)的小程序

写在前面:
最近有小伙伴说他是一个综合经理,各个部门的数据都是分开统计的,每次合并这些部门的表都好麻烦,重复工作,浪费时间,听说我是个代码高手,问我能不能提高一下他的效率,我说,提高效率没问题,但我这下午茶嘛,是不是要安排一下,小伙伴二话没说,立马安排,我瞅了一眼这位小伙伴的数据,立马抽了几个以前写过的函数拼接一下,他要的代码就完成啦!

目前已经打包成exe文件

工具链接(点我跳转):https://download.csdn.net/download/Captain_DUDU/85411920

01.以下是代码解析,小白可以从这开始看,高手的话直接看代码吧!!

公主号:船长数据分析
vx:captain_data
#有问题可以找我哦~

if __name__ == '__main__':
    ############请输入路径############
    f_path=input("--- 请输入文件主路径:")
    main_data_in(f_path)

先来看主函数,传入了一个文件夹路径,也就是说,此小程序需要你把所有表格数据放在一个目录下,然后在运行本程序时将路径填入,接着路径被传递到main_data_in 这个函数

# 主函数模块 所有函数调用归集在此函数
def main_data_in(path_all_str):
    fPath_name_list=group_by_pathName(path_all_str)
    data_out=concat_pathName(fPath_name_list)
    out_Excel(data_out)

查看 main_data_in 函数 里头依次调用了
1. group_by_pathName
2. concat_pathName
3. out_Excel
三个函数

# 读取路径下所有文件名返回路径集列表
def group_by_pathName(f_path):
    f_path = f_path
    #fPath_jymx_list_error = []
    fPath_name_list = []
    for root, dirs, files in os.walk(f_path):
        for name in files:
            fPath_name_list.append(os.path.join(root, name))
    return fPath_name_list

接着我们看第一个函数 group_by_pathName在干什么,从以上代码我们看到,
传入的 f_path 用os.walk(f_path) q嵌套一个循环,然后该路径下所有文件名被遍历并装进 fPath_name_list 这个列表中

# 合并所有表格    
def concat_pathName(fPath_name_list):
    print("--- 开始加载数据 ---")
    data_top = pd.read_excel(fPath_name_list[0],dtype='str')    
    for fPath_name in fPath_name_list:
        print("---正在加载:%s---"%(fPath_name))
        data_load = pd.read_excel(fPath_name, dtype='str')
        data_top = pd.concat([data_top, data_load], axis=0)
    data_top=data_top.drop_duplicates(data_top.columns,keep="first")
    data_out=data_top
    return data_out

然后我们看第二个函数concat_pathName,该函数将 group_by_pathName返回的fPath_name_list 列表传入,再遍历,读取,用pd.concat 将每次读取的dataFrame竖向(axis=0)拼接,再利用drop_duplicates 将data_top第一次重复读取的数据去重,也就得到了所有合并数据

# 数据导出函数
def out_Excel(data_out_dataFrame):
    data_out_dataFrame.to_excel("07.合并excel数据/合并导出.xlsx",index=False)
    print("--- 合并数据导出成功 ---")

而前面两个函数已经把所有需要合并的个工作做完,接下来我们只要将返回的dataFrame 导出在我们工作的文件夹就行了。
该小程序简单运用了os库遍历了路径,然后再利用concat将每次读取的数据不断竖向拼接,一下子将我们在工作中遇到的多Excel表,同列名的情况自动化了,从此解放双手,10秒钟完成1小时的工作量。
看到这里了,记得关注收藏博主,下次送上单个Excel表,多工作簿合并代码!


全代码:
import numpy as np
import pandas as pd
import os

# vx:672377334 船长
# QQ:672377334 船长
# 列名对齐
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)

# 读取路径下所有文件名返回路径集列表
def group_by_pathName(f_path):
    f_path = f_path
    #fPath_jymx_list_error = []
    fPath_name_list = []
    for root, dirs, files in os.walk(f_path):
        for name in files:
            fPath_name_list.append(os.path.join(root, name))
    return fPath_name_list
    

# 合并所有表格    
def concat_pathName(fPath_name_list):
    print("--- 开始加载数据 ---")
    data_top = pd.read_excel(fPath_name_list[0],dtype='str')    
    for fPath_name in fPath_name_list:
        print("---正在加载:%s---"%(fPath_name))
        data_load = pd.read_excel(fPath_name, dtype='str')
        data_top = pd.concat([data_top, data_load], axis=0)
    data_top=data_top.drop_duplicates(data_top.columns,keep="first")
    data_out=data_top
    return data_out

# 数据导出函数
def out_Excel(data_out_dataFrame):
    data_out_dataFrame.to_excel("07.合并excel数据/合并导出.xlsx",index=False)
    print("--- 合并数据导出成功 ---")
   
# 主函数模块 所有函数调用归集在此函数
def main_data_in(path_all_str):
    fPath_name_list=group_by_pathName(path_all_str)
    data_out=concat_pathName(fPath_name_list)
    out_Excel(data_out)
    

if __name__ == '__main__':
    ############请输入路径############
    f_path=input("--- 请输入文件主路径:")
    main_data_in(f_path)

v1.2 迭代版本

支持csv与excel 同列名一起合并

import pandas as pd
import os
import datetime
# 列名对齐
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)

def path_name_time():
    global path_nameTime
    timestr = datetime.datetime.now().strftime('%Y%m%d%H%M%S')  ###生成当下的时间
    path_nameTime = timestr

def get_filepath(fpath):  # 获取文件路径函数
    print("--- 开始获取文件路径 ---")
    fpath_list = []
    for root, dirs, files in os.walk(fpath):
        for name in files:
            fpath_list.append(os.path.join(root, name))
    return fpath_list
    print("--- 获取文件路径完成 ---")


def concat_file(fname_list):  # 文件合并函数
    xls_top = pd.DataFrame()
    # xls_top = pd.read_excel(fname_list[0], dtype = 'str')
    print("--- 开始合并文件 ---")
    for name in fname_list:
        print("--- 正在合并文件:%s ---" % os.path.basename(name))
        if 'xls' in name or 'xlsx' in name:
            xls_load = pd.read_excel(name, dtype='str')
        elif 'csv' in name:
            xls_load = pd.read_csv(name, dtype='str')
        else:
            print('--- 文件:%s非excel或csv文件,跳过 ---' % os.path.basename(name))
            continue
        xls_ls = list(xls_load.columns)
        xls_ls.append('文件路径')
        xls_load['文件路径'] = name
        xls_top = xls_top.append(xls_load)
    # xls_top.drop_duplicates(keep="first", inplace=True)
    xls_out = xls_top[xls_ls]
    return xls_out
    print("--- 合并文件完成 ---")


def out_Excel(xls_out):  # 数据导出函数
    path_name_time()
    out_file_name = './'+path_nameTime + '合并导出.xlsx'

    xls_out.to_excel(out_file_name, index=False)
    print("--- 合并数据导出成功 ---")
    a = input('按任意键退出程序')

if __name__ == '__main__':
    print("--- 请将不需要合并的excel或csv文件移出文件夹 ---")
    fpath = input('请输入文件夹路径(输入后回车键确认):')
    fname_list = get_filepath(fpath)
    concat_end_file = concat_file(fname_list)
    out_Excel(concat_end_file)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Captain_Data

打赏一下~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值