import pandas as pd from pandas import DataFrame as DF import os class SplitExcel(object): """ 分割任意的Excel文件,根据指定的列对文件进行分割,并存储到指定的位置, 分割的时候可以指定子文件包含哪些列。会对指定的分割列进行去重 参数: file 要被分割的文件地址 by 根据哪个列进行分割 prefix 生成的文件的前缀,默认是 前缀 + - + 分割项.xlsx subCols 子文件包含哪些字段,这些字段必须在被分割文件中存在,否则将报错 joinStr 文件名中连接prefix 和 分割项的连接符合,默认是‘-’ 如果要根据多列对文件进行分割,程序会先生成一个临时列,其中每行存储的内容是指定的多列的值使用joinStr指定的字符串连接的字符串 并使用这个新列进行分割 """ def __init__(self, file,by=[],prefix="",subCols=[],joinStr="-"): self.file = file self.by = by self.prefix = prefix self.subCols = subCols self.joinStr = joinStr self.df = pd.read_excel(self.file) self.df.reset_index(drop=True) print("-"*50) print("读取文件的列名有:",self.df.columns.tolist()) print("-"*50)
# 内部功能,按行处理DF的数据 def __partical__(self,df): values = [] for col in self.by: values.append(df[col]) return self.joinStr.join(values) def __make__(self): self.df["makedCol"] = self.df.apply(self.__partical__,axis=1,result_type="expand") return "makedCol" def split(self,by=[],target_dir=""): if not by and not self.by: print("错误:必须指定by参数,可以在初始化时指定也可以在调用split时指定,目标分割列只能是一列") return if not target_dir: target_dir = os.getcwd() else: # 检查文件夹是否存在,不存在就新建 if not os.path.exists(target_dir): os.makedirs(target_dir) print("分割后文件将会被存储在 ",target_dir) split_by = "" if by: split_by = by self.by = by else: split_by = self.by # 指定的列的内容都会被当做字符串处理 self.df[by] = self.df[by].astype(str) # 如果by是列表,并且长度大于1 if isinstance(by,str): newBy = by if isinstance(by,list): if len(by) == 1: newBy = by[0] elif len(by)>=2: newBy = self.__make__() # 找到指定的by列有多少个不同的值,并按照这些值分组 items = set(self.df[newBy].values.tolist()) result_files_list = [] for item in items: dfa = self.df.loc[self.df[newBy]==item] dfa.reset_index(drop=True) # 检查是否指定了子文件的列,如果指定了则按照指定的列生成子文件 if self.subCols: dfx = dfa[self.subCols] else: dfx = dfa filename = "" if self.prefix: filename = self.prefix + self.joinStr + item + ".xlsx" else: filename = item + ".xlsx" dfx.to_excel(target_dir + "\\" + filename,index=False) result_files_list.append(target_dir + "\\" + filename) # 打开目标文件夹 os.startfile(target_dir) return result_files_list if __name__ == '__main__': splitexcel = SplitExcel("一季度大部门人员质量成本.xlsx",subCols=['部门名称', '部门代码', '一季度质量成本'],joinStr="#") results = splitexcel.split(["指定","指定1"],r"D:\projects\项目统计工具\分割文件\文件") print(results)
标签:__,分割,python,self,Excel,指定,DataFrame,df,dir From: https://www.cnblogs.com/xiaoyuquanquan/p/17085802.html