python pandas 操作 Excel(多sheet)并保存为多sheet的Excel

1、pandas 高效读取 excel 多个 sheet 文件


import timeit
import pandas as pd
import time
fpath = r'F:\python_workspace\案例研究\爬虫\保证金监控中心\界面设计2\结算文件\xxxx_2018-07-12.xls'
 
def read1_1(fpath, num):
    for i in range(num):
        io = pd.io.excel.ExcelFile(fpath)
        data =pd.read_excel(io, sheet_name='持仓明细')
        data2 =pd.read_excel(io, sheet_name='成交明细')
        data2 =pd.read_excel(io, sheet_name='成交明细')
        #data =pd.read_excel(io, sheet_name=4)
        io.close()
 
def read1_2(fpath, num):
    for i in range(num):
        io = pd.io.excel.ExcelFile(fpath)
        #data =pd.read_excel(io, sheet_name='持仓明细')
        data =pd.read_excel(io, sheet_name=4)
        data2 =pd.read_excel(io, sheet_name=2)
        data2 =pd.read_excel(io, sheet_name=2)
        io.close()
    
def read2_1(fpath, num):
    for i in range(num):
        #io = pd.io.excel.ExcelFile(fpath)
        data =pd.read_excel(fpath, sheet_name='持仓明细')
        data2 =pd.read_excel(fpath, sheet_name='成交明细')
        data2 =pd.read_excel(fpath, sheet_name='成交明细')
        #data =pd.read_excel(io, sheet_name=4)
        #io.close()
        
    
def read2_2(fpath, num):
    for i in range(num):
        data =pd.read_excel(fpath, sheet_name=4)
        data =pd.read_excel(fpath, sheet_name=2)
        data =pd.read_excel(fpath, sheet_name=2)
        
 
        
@profile
def run(num):
    read1_1(fpath, num)
    read1_2(fpath, num)
    read2_1(fpath, num)
    read2_2(fpath, num)
    
    
run(100)



==============================================================
    49                                           @profile
    50                                           def run(num):
    51         1     47338937 47338937.0     13.5      read1_1(fpath, num)
    52         1     47416650 47416650.0     13.6      read1_2(fpath, num)
    53         1    127432634 127432634.0     36.5      read2_1(fpath, num)
    54         1    127205921 127205921.0     36.4      read2_2(fpath, num)


结论: 很明显,执行速度差了一倍。首先指向io的方式读取速度会更快一些。
注意:如果一个excel文件,你仅仅需要读取其中的1个sheet,那么所有的操作耗时是基本一致的。这里高效率是指的多
     个sheet表单的情况下。

 2、pandas 保存多个sheet的excel文件

"""
    DataFrame进行保存时为了避免被不断地覆盖,这里使用了openpyxl
"""
writer = pd.ExcelWriter(report_excel_name, engine='openpyxl')
num = 1
for sheet_name in sheet_names:
        # 下面的保存文件处填写writer,结果会不断地新增sheet,避免循环时被覆盖
    report_dict[sheet_name].to_excel(excel_writer=writer, sheet_name=sheet_name, encoding="GBK")
    print(sheet_name + "  保存成功!共%d个,这个 sheet 是第%d个。" % (len(sheet_names), num))
    num += 1
writer.save()
writer.close()

3、文件下文件处理的自定义代码库

  •   功能:处理给定文件夹下第一层的excel文件数据
class File_Hanlder():
    def __init__(self):
        pass


    def list_excel_dir(self,dir_path):
        self.dir_path = dir_path
        # 遍历目录
        excels_file = [i for i in os.listdir(self.dir_path) if i.endswith('.xlsx')]
        excels_path = [os.path.join(self.dir_path,i) for i in excels_file]

        # 保存该路径下所有的 excel 文件名的 列表
        self.excels_file = excels_file
        # 保存该路径下所有的 excel 文件名的 相对路径, './source_datas/表格名 '
        self.excels_path = excels_path

        return excels_file,excels_path

    def single_excel_read(self,excel_path):
        """

        :param excel_path: 一张 excel表的 路径
        :return: excel 的 {sheet:dict} 数据 或者 单个DataFrame数据
        """
        io = pd.io.excel.ExcelFile(excel_path)

        content_tmp = pd.read_excel(io, sheet_name=None)
        # 判断源excel是否有多个 sheet
        if isinstance(content_tmp,dict):
            # 保存为 dict 数据
            self.content_dict = content_tmp
        else:
            # 保存为 DataFrame 数据
            self.content_df = content_tmp
        return content_tmp

    def single_excel_save(self, single_excel_sheets, excel_name, report_dir_path, sheet_names=None):
        """

        :param single_excel_sheets: 一张需要保存的 excel 的 {keys:df} 字典数据
        :excel_name  待保存的 源excel的名字
        :param report_path: 需要保存地址的 dir 路径
        :sheet_names 保存的excel表的sheet名,默认使用源数据字典的 key名
        :return:
        """

        utils.check_directory(report_dir_path)
        report_excel_name = 'report_' + excel_name
        report_excel_name = os.path.join(report_dir_path, report_excel_name)

        writer = pd.ExcelWriter(report_excel_name, engine='openpyxl')

        keys_iter = list(single_excel_sheets.keys())
        if sheet_names is None:
            sheet_names = keys_iter
        else:
            # 必须指定保存的 sheets 与 源表 dict 的 keys 数相同
            assert len(sheet_names) == len(keys_iter)

        logger.info('start save excel:{} ... '.format(excel_name))
        num = 1
        for idx, key in enumerate(keys_iter):
            # 下面的保存文件处填写writer,结果会不断地新增sheet,避免循环时被覆盖
            single_excel_sheets[key].to_excel(excel_writer=writer, sheet_name=sheet_names[idx], encoding="GBK")
            logger.info(sheet_names[idx] + "  保存成功!共%d个,这个 sheet 是第%d个。" % (len(sheet_names), num))
            num += 1
        writer.save()
        writer.close()
        logger.info('finish save excel:{} ... '.format(excel_name))

    def data_preprocess(self,dataframe):
        """
        预处理 DataFrame 的 NULL 值
        :return:
        """
        return dataframe.dropna()

    def multi_excels_read(self):
        pass
    def multi_excels_save(self):
        pass



if __name__ == '__main__':

    file_obj = File_Hanlder()
    _,files_path = file_obj.list_excel_dir('./target_datas')
    file_obj.single_excel_read(files_path[0])

 

原文:

            Pandas read_excel()参数详解

          【数据处理】pandas DataFrame 对多个sheet表格的excel 读取、处理、保存

   

你可能感兴趣的:(AI_小代码库)