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)