需求描述:将一个excel文件按照某一列字段拆分成多个文件。比如将图一表格按照专业拆分成人力资源管理、会计、市场营销3个文件,并以专业名称命名文件名。效果见图二。
功能实现:主要利用groupby函数。
图一:
图二:
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@文件 :SplitByMajor.py
@说明 :python之按照excel某列字段将一个文件拆分成多个文件。
@时间 :2020/10/21 21:03:18
@作者 :侃侃
@版本 :3.8
'''
import pandas as pd
import os
#按照文件所包含的专业新建不同专业的工作表
def creatfilebymajor(filepath,filename):
scoresinfo=pd.read_excel(filepath,dtype=str)
#获取专业列所有数值,包括重复的
majors=scoresinfo['专业']
#获取去重后的专业并转化为list方便读取数据,set函数是一个无序不重复的元素集,list为[],set为{}
nmajors=list(set(majors))
#获取专业的个数,即需要创建工作表的个数
filenums=len(nmajors)
#根据专业数量,创建对应个数的工作表,工作表的名称以专业命名
for i in range(0,filenums,1):
majorpath=filepath.replace(filename,"")+list(nmajors)[i]+".xlsx"
df=pd.DataFrame()
df.to_excel(majorpath)
def splitbymajor(filepath,filename):#filepath="C:\\Users\\lenovo\\Desktop\\test\\scores.xlsx"这里必须双斜杠 ,filename="scores.xlsx"
#1、创建各专业文件
creatfilebymajor(filepath,filename)
scores=pd.read_excel(filepath,dtype=str)#一张表读出来为dataframe类型
grouped=scores.groupby("专业")#按照专业分组
majors=scores['专业']#获取专业列所有数值,包括重复的
nmajors=list(set(majors))#获取去重后的专业并转化为list方便读取数据,set函数是一个无序不重复的元素集,list为[],set为{}
#2、分别将各专业从分组后的集合中取出.get_group("专业名称"),然后专业名称与文件名称比对,配对后写入对应专业文件
dir=filepath.replace("\\"+filename,"")#获取文件所在的根目录,即文件夹目录
for i in range(0,len(nmajors),1):
major=grouped.get_group(nmajors[i])
#遍历文件夹下面的所有文件
for root_dir,sub_dir,files in os.walk(r'' + dir):#遍历目录下的根目录,子目录,所有文件
# 对文件列表中的每一个文件进行处理,如果文件名字是以‘xlxs’结尾就
# 认定为是一个excel文件,当然这里还可以用其他手段判断,比如你的excel
# 文件名中均包含‘res’,那么if条件可以改写为
# if file.endswith('xlsx') and 'res' in file:
for file in files:
if file==nmajors[i]+'.xlsx':
major.to_excel(filepath.replace(filename,"")+nmajors[i]+".xlsx",index=False)
filepath="E:\\MJC\\工具资料\\微信公众号\\20201021\\test.xls"
filename="test.xls"
splitbymajor(filepath,filename)