python读取大型Excel文件
前言
python
读取Excel
文件的库有pandas
、openpyxl
、xlrd
等,但是各有优缺点,虽说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
"""
本文来自博客园,仅供参考学习,如有不当之处还望不吝赐教,不胜感激!转载请注明原文链接:https://www.cnblogs.com/rong-z/p/18210989
作者:cnblogs用户