1、问题背景

一般来说,python读取excel文件不支持分块读取(我用过的处理excel的几个库是这样),都是一次性读取。如果excel文件很大,我们可能需要知道excel文件的读取进度,
那么要怎么做呢?

2、pandas分块读取excel文件可行吗?

网上很多教程说pandas的read_excel的chunksize 参数支持分块读取,经过验证,可能以前的pandas是支持的,但是现在的read_excel没有这个参数。
而read_csv是有这个参数并支持分块读取。read_csv显然不能满足我们的要求。
查了许多资料后,博主发现了一种近似模拟这个文件读取过程的方法,分享出来,供大家使用。

3、opnepyxl的只读模式

openpyxl的只读模式比较特殊,他返回的是一个生成器对象,读取速度非常快,100W行的excel文件,pands读取需要50s左右,而openpyxl的只读模式只要0.004秒,对比起来简直可以忽略不计!

4、一种近似替代读取文件进度的方式

但是只读模式不支持修改。但是如果我们想要操作读取进来的文件,得先把表数据从生成器中拿出来,放到二维列表或者其他数据结构中。这个从生成器取数据的过程可以看做读取excel文件的进度。

5、待优化

我用的二维列表存储生成器的数据,这个过程耗时30s左右。我觉得还是比较慢,想了很久没有想到什么好的解决方法,有好思路的小伙伴欢迎留言交流。

6、代码

import openpyxl
from tqdm import tqdm


workbook = openpyxl.load_workbook("output100W.xlsx", read_only=True)
sheet = workbook.active
data_list = []
# 设置进度条总数为表的行数
pbar = tqdm(total=sheet.max_row)
for i in tqdm(sheet.iter_rows(values_only=True)):
    data_list.append(i)
    # 每append一行数据,进度条更新1
    pbar.update(1)  # 更新进度条
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐