在优化的openpyxl读取器中使用ws.iter_rows遍历一系列行

我需要读取10×5324单元格的xlsx文件

这是我想要做的事情的要点:

from openpyxl import load_workbook filename = 'file_path' wb = load_workbook(filename) ws = wb.get_sheet_by_name('LOG') col = {'Time':0 ...} for i in ws.columns[col['Time']][1:]: print i.value.hour 

代码花了太长时间才能运行,然后它应该(我正在执行操作,而不是打印),过了一段时间,我不耐烦,取消了它。

任何想法如何在优化的阅读器中工作? 我需要遍历一个行的范围,而不是遍历所有的行。 这是我的尝试,但它是错的:

 wb = load_workbook(filename, use_iterators = True) ws = wb.get_sheet_by_name('LOG') for i in ws.iter_rows[1:]: print i[col['Time']].value.hour 

有没有办法,我可以做到这一点,没有范围function?

我想一个办法可以做到这一点:

 for i in ws.iter_rows[1:]: if i.row == startrow: continue print i[col['Time']].value.hour if i.row == endrow: break 

但有没有更优雅的解决scheme? (这不工作任何btw)

下界的最简单的解决scheme是这样的:

 # Your code: from openpyxl import load_workbook filename = 'file_path' wb = load_workbook(filename, use_iterators=True) ws = wb.get_sheet_by_name('LOG') # Solution 1: for row in ws.iter_rows(row_offset=1): # code to execute per row... 

这里用另一种方法来执行你所描述的enumerate函数:

 # Solution 2: start, stop = 1, 100 # This will allow you to set a lower and upper limit for index, row in enumerate(ws.iter_rows()): if start < index < stop: # code to execute per row... 

索引variables保持你在哪一行的数量,所以它可以用来代替范围或xrange。 这个方法非常简单,可以和迭代器一起工作,不像范围或切片,如果需要的话,也可以只用下限。 干杯!

从文档 :

注意:当工作表在内存中创build时,它不包含单元格。 它们在第一次访问时创build。 这样我们不会创build永远不会被访问的对象,从而减less内存占用。

警告:由于这个特性,即使没有给它们赋值,通过滚动单元格而不是直接访问它们将在内存中创build它们。 就像是

 >>> for i in xrange(0,100): ... for j in xrange(0,100): ... ws.cell(row = i, column = j) 

将在内存中创build100x100的单元格。

但是,有一种方法可以清除所有不需要的细胞,我们稍后会看到。

我认为访问列或行属性将导致许多单元格必须加载到内存中。 我build议只试图直接访问你需要的单元格。

例如。

 col_name = 'A' start_row = 1 end_row = 99 range_expr = "{col}{start_row}:{col}{end_row}".format( col=col_name, start_row=start_row, end_row=end_row) for (time_cell,) in ws.iter_rows(range_string=range_expr): print time_cell.value.hour