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表单的情况下。
"""
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()
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 读取、处理、保存