python读取大型Excel文件

前言

python读取Excel文件的库有pandasopenpyxlxlrd等,但是各有优缺点,虽说openpyxl在指定read_only参数后读取大型文件的速度非常快,但是它只适用于xlsx类型文件,且有些银行系统下载的报表不手动打开进行保存它都无法完整读取一行数据。最终基本都会使用pandas读取,也方便后期数据清洗。下面就主要针对pandas版本低于2.2时,无法通过直接指定engine='calamine',但是又想提升读取大型Excel的速度,那么还是可以用python-calamine库实现的,并且速度提升非常显著!

# 安装
pip install python-calamine

不指定engine参数,直接读取一个16万行的Excel,大概耗时18秒左右

a = time.time()
df = pd.read_excel(excel_path1, header=0)
print(df.head())
print(df.shape)
print(time.time() - a)

'''
   编号 需求部门           需求名称  ... 单次运行时间(分钟).1 总运行时间(小时).1  是否达到业务要求.1
0   1  风险部         每日经营简报  ...         20.0       22.85           是
1   2  风险部           报表下载  ...         17.0        1.30           是
2   3  风险部     每日报表清单批量下载  ...         24.0       16.00           是
3   4  风险部     每月报表清单批量下载  ...        120.0        8.85           是
4   5  风险部  地区存贷款市场份额分析报告  ...          0.6        0.04           是

[5 rows x 17 columns]
(162000, 17)
18.343066215515137
'''

2.0<pandas<2.2

指定engine参数后的读取速度明显变快,速度提升大概75%以上

import pandas as pd
from python_calamine.pandas import pandas_monkeypatch


a = time.time()
pandas_monkeypatch()
df = pd.read_excel(excel_path1, header=0, engine='calamine')
print(df.head())
print(df.shape)
print(time.time() - a)

'''
   编号 需求部门           需求名称  ... 单次运行时间(分钟).1 总运行时间(小时).1  是否达到业务要求.1
0   1  风险部         每日经营简报  ...         20.0       22.85           是
1   2  风险部           报表下载  ...         17.0        1.30           是
2   3  风险部     每日报表清单批量下载  ...         24.0       16.00           是
3   4  风险部     每月报表清单批量下载  ...        120.0        8.85           是
4   5  风险部  地区存贷款市场份额分析报告  ...          0.6        0.04           是

[5 rows x 17 columns]
(162000, 17)
4.306011199951172
'''

pandas<2.0

示例1

import pandas as pd
from python_calamine import CalamineWorkbook


wb = CalamineWorkbook.from_path(filename)
# sht_names = wb.sheet_names    # 获取所有sheet名
# row_list = wb.get_sheet_by_name(sheet).to_python()
row_list = wb.get_sheet_by_index(0).to_python()
df = pd.DataFrame(row_list[1:], columns=row_list[0])
# df.reset_index(drop=True, inplace=True)
print(df.head())
print(df.shape)

"""
   编号 需求部门           需求名称  ... 单次运行时间(分钟).1 总运行时间(小时).1  是否达到业务要求.1
0   1  风险部         每日经营简报  ...         20.0       22.85           是
1   2  风险部           报表下载  ...         17.0        1.30           是
2   3  风险部     每日报表清单批量下载  ...         24.0       16.00           是
3   4  风险部     每月报表清单批量下载  ...        120.0        8.85           是
4   5  风险部  地区存贷款市场份额分析报告  ...          0.6        0.04           是

[5 rows x 17 columns]
(162000, 17)
耗时:4.306011199951172
"""

示例2

生成器

import pandas as pd
from python_calamine import CalamineWorkbook


def iter_excel_calamine(file):
    workbook = CalamineWorkbook.from_filelike(file)
    rows = iter(workbook.get_sheet_by_index(0).to_python())
    # headers = list(map(str, next(rows)))
    for row in rows:
        # yield dict(zip(headers, row))
        yield row


tmp_list = []
with open(filename, "rb") as fh:
    for row in iter_excel_calamine(fh):
        tmp_list.append(row)
df = pd.DataFrame(tmp_list)
print(df.head())
print(df.shape)

"""
   编号 需求部门           需求名称  ... 单次运行时间(分钟).1 总运行时间(小时).1  是否达到业务要求.1
0   1  风险部         每日经营简报  ...         20.0       22.85           是
1   2  风险部           报表下载  ...         17.0        1.30           是
2   3  风险部     每日报表清单批量下载  ...         24.0       16.00           是
3   4  风险部     每月报表清单批量下载  ...        120.0        8.85           是
4   5  风险部  地区存贷款市场份额分析报告  ...          0.6        0.04           是

[5 rows x 17 columns]
(162001, 17)
耗时:4.123789112378923
"""
posted @ 2024-05-24 14:58  cnblogs用户  阅读(673)  评论(0编辑  收藏  举报