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

Ali*_*oon 10 python excel xlsx openpyxl

我需要读取10x5324单元格的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
Run Code Online (Sandbox Code Playgroud)

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

知道如何在优化的阅读器中使用它吗?我需要迭代一系列行,而不是遍历所有行.这是我试过的,但这是错的:

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
Run Code Online (Sandbox Code Playgroud)

没有范围功能,有什么办法可以做到吗?

我想有一种方法可以做到:

for i in ws.iter_rows[1:]:
    if i.row == startrow:
        continue
    print i[col['Time']].value.hour
    if i.row == endrow:
        break
Run Code Online (Sandbox Code Playgroud)

但是有更优雅的解决方案吗?(这不是顺便说一句)

mik*_*173 20

具有下限的最简单的解决方案将是这样的:

# 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...
Run Code Online (Sandbox Code Playgroud)

这是使用该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...
Run Code Online (Sandbox Code Playgroud)

索引变量会保留您所在行的计数,因此可以使用它来代替范围或xrange.这个方法非常简单,与范围或切片不同,它可以与迭代器一起使用,如果需要,也可以只与下限一起使用.干杯!


Dun*_*nes 5

文档:

注意:在内存中创建工作表时,它不包含单元格.首次访问时会创建它们.这样我们就不会创建永远不会被访问的对象,从而减少了内存占用.

警告:由于此功能,滚动单元格而不是直接访问它们将在内存中创建它们,即使您没有为它们分配值.就像是

>>> for i in xrange(0,100):
...             for j in xrange(0,100):
...                     ws.cell(row = i, column = j)
Run Code Online (Sandbox Code Playgroud)

将在内存中创建100x100个单元格,无需任何操作.

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

我认为访问列或行属性将导致许多单元格必须加载到内存中.我建议只尝试直接访问您需要的细胞.

例如.

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
Run Code Online (Sandbox Code Playgroud)