11

我需要读取 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

代码运行时间太长了(我正在执行操作,而不是打印),过了一会儿我不耐烦了,取消了它。

知道如何在优化的阅读器中工作吗?我需要遍历一系列行,而不是所有行。这是我尝试过的,但它是错误的:

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

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

我想一种方法是:

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

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

4

2 回答 2

21

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

# 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...

index 变量会记录您所在的行,因此可以使用它来代替 range 或 xrange。这种方法非常简单,可以与范围或切片不同的迭代器一起使用,如果需要,也可以只与下限一起使用。干杯!

于 2012-12-19T22:49:55.090 回答
5

文档中:

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

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

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

将在内存中创建 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
于 2012-05-16T10:20:45.817 回答