当前位置:   article > 正文

python-EXCEL工作表拆分到不同工作簿(可按照不同字段拆分)_oython 针对多个sheet的excel表拆分

oython 针对多个sheet的excel表拆分

Python拆分Excel工作表


测试环境:py3+win10,不同环境可能会有些许差异。

  • 实现功能: 对于文本字段,可以按照不同字段将一张sheet切分为不同工作簿,切分工作簿导出路径,默认为读取excel目录,如需指定,请设置out_dir参数,SheetSplit.mkfile方法可以生成测试文件,生成测试文件请指定out_dir输出目录参数。

  • 需要用到的模块:
    • pandas:文件读取,记录抽取,文件导出,生成测试文件也会用到,需额外安装。
    • pandasql:DataFrame里写sql输出DataFrame,需要额外安装。
    • numpy、random:这里主要是生成测试文件时,用到,numpy模块需额外安装。
    • os:文件路径相关操作
    • itertools:生成不同特征的笛卡尔积列表
    • 安装模块:cmd命令行输入:pip3 install 模块名

  • 参数说明:
    • features:筛选特征列表,可传入多个字符串特征,比如这里按照地区和水果两个字段进行工作簿切分:[‘地区’,‘水果’]
    • file:EXCEL切割数据源完整路径,如果只是生成测试文件,可以不用指定。
    • sheetname:EXCEL切割数据源表的表名,默认为Sheet1
    • out_dir:file_directory,如果需要指定切割文件导出路径,或者生成测试文件,请指定该参数,比如:‘d:/桌面’

  • 小坑:
    • 在sqldf执行sql语句时,刚开始一直提示找不到df,我把语句单独拿出来执行,查询又没问题,可能是不同模块调用问题,这里要声明df为全局变量。

  • 局限:
    目前仅仅只能针对文本字段进行切分,代码还不够灵活,不支持数值字段切割,文本字段分组切割,仅供参考,欢迎大家补足指点。

测试文件式样:
数据源


  • 按照’地区’和水果字段切分结果式样:
    切分结果式样
  • 代码如下:
# coding=utf-8

from pandasql import sqldf
import pandas as pd
# from itertools import product
import numpy as np
from random import choices
import os

class SheetSplit():
    def __init__(self,features=[],file='',sheetname='Sheet1',out_dir=''):
        self.features = features        #筛选特征
        self.file = file        #读取的excel完整路径
        self.sheet_name = sheetname     #读取的工作表名称
        self.sql_where = ' = "{}" and '.join(self.features) + ' = "{}"'     #特征条件sql字符串
        if out_dir == '':       #文件切分输出路径,默认为excel所在路径
            self.out_dir = os.path.dirname(file)
        else:
            self.out_dir = out_dir

    def mkfile(self):
        '''生成测试文件'''
        area = ['广州', '深圳', '东莞', '佛山']
        fruits = ['apple', 'orange', 'banana', 'watermelon','pear']
        df = pd.DataFrame(np.random.randint(30,150,size=50),columns=['销售'])
        df['水果'] = choices(fruits,k=50)
        df['地区'] = choices(area,k=50)
        df = df.reindex(columns=['地区','水果','销售'])
        df.to_excel(os.path.join(self.out_dir,'fruits_test.xlsx'),index=False)

    def not_file_exists(self,df):
        '''判断,输出不存在的特征列表'''
        out_features = []
        columns = df.columns
        for each in self.features:
            if not each in columns:
                out_features.append(each)
        return out_features

    def feature_product(self,df):
        '''生成不同筛选特征的列表,字段去重'''
        split_feature = self.features
        feature_product = ((x,y) for (x,y) in df[split_featurue].drop_duplicates().values)
        return feature_product

    def split(self,feature_product):
        '''切分工作表到out_dir文件目录下'''
        global df
        split_file_dir = os.path.join(self.out_dir,'EXCEL切分文件')
        os.mkdir(split_file_dir)
        os.chdir(split_file_dir)
        pysqldf = lambda x: sqldf(x, globals())
        for feature_select in feature_product:
            sql = 'select * from df where {}'.format(self.sql_where).format(*feature_select)
            split_df = pysqldf(sql)
            split_df.to_excel('-'.join(feature_select)+'.xlsx',index=False)
            print('正在导出文件:{}'.format('-'.join(feature_select)+'.xlsx'))

    def main(self):
        global df     # 使用pandsql,这里需要声明df为全局变量,不然会报错;
        if len(self.file) == 0 or len(self.features) == 0:
            print('您未输入切分特征选项或文件路径,请检查后再操作......')
            exit()
		'''文件读取'''
        df = pd.read_excel(self.file,sheet_name=self.sheet_name)
        '''检查输入列表特征是否存在于数据源特征'''
        out_features = self.not_file_exists(df)
        if len(out_features) > 0:
            print('您输入的以下特征不存在,请重新输入:{}'.format(';'.join(out_features)))
            exit()
        '''生成不同特征的笛卡尔积列表''' 
        feature_product = self.feature_product(df)
        '''sql记录筛选,导出文件'''
        self.split(feature_product)

if __name__ == '__main__':
    m = SheetSplit(features=['地区','水果'],
                   file=r"D:\桌面\fruits_test.xlsx")
    m.main()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/74963
推荐阅读
相关标签
  

闽ICP备14008679号