python – Openpyxl优化单元格搜索速度

我需要在Excel工作表中搜索包含某些模式的单元格.它需要的时间比我能处理的还多.我可以写的最优化的代码如下.由于数据模式通常是一行一行,所以我使用iter_rows(row_offset = x).不幸的是,下面的代码在每个for循环中找到给定模式的次数越来越多(从毫秒开始,几乎达到一分钟).我究竟做错了什么?

import openpyxl
import datetime
from openpyxl import Workbook

wb = Workbook()
ws = wb.active
ws.title = "test_sheet"

print("Generating quite big excel file")

for i in range(1,10000):
    for j in range(1,20):
        ws.cell(row = i, column = j).value = "Cell[{},{}]".format(i,j)

print("Saving test excel file")
wb.save('test.xlsx')

def FindXlCell(search_str, last_r):
    t = datetime.datetime.utcnow()
    for row in ws.iter_rows(row_offset=last_r):
        for cell in row:
            if (search_str == cell.value):
                print(search_str, last_r, cell.row, datetime.datetime.utcnow() - t)
                last_r = cell.row
                return last_r
    print("record not found ",search_str, datetime.datetime.utcnow() - t)
    return 1

wb = openpyxl.load_workbook("test.xlsx", data_only=True)
t = datetime.datetime.utcnow()
ws = wb["test_sheet"]
last_row = 1
print("Parsing excel file in a loop for 3 cells")
for i in range(1,100,1):
    last_row = FindXlCell("Cell[0,0]", last_row)
    last_row = FindXlCell("Cell[1000,6]", last_row)
    last_row = FindXlCell("Cell[6000,6]", last_row)

解决方法:

多次循环工作表是低效的.搜索逐渐变慢的原因似乎是每个循环中使用的内存越来越多.这是因为last_row = FindXlCell(“Cell [0,0]”,last_row)意味着下一次搜索将在行的末尾创建新单元格:openpyxl按需创建单元格,因为行在技术上可能是空的,但其中的单元格是仍然可以解决.在脚本的末尾,工作表总共有598000行,但您始终从A1开始搜索.

如果您希望多次搜索大文件中的文本,那么创建一个由文本键入的矩阵可能是有意义的,坐标为值.

就像是:

matrix = {}
for row in ws:
    for cell in row:
         matrix[cell.value] = (cell.row, cell.col_idx)

在现实世界的示例中,您可能希望使用defaultdict来处理具有相同文本的多个单元格.

这可以与只读模式结合使用,以实现最小的内存占用.当然,除非你想编辑文件.

上一篇:python – 无法在openpyxl中导入工作簿


下一篇:使用openpyxl将数据写入现有的Excel工作表