迭代的范围内使用ws.iter_rows行中openpyxl的优化阅读器(iterating ove

2019-06-24 12:21发布

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

但有一个更好的解决方案? (不工作,要么BTW)

Answer 1:

有下界,最简单的解决办法是这样的:

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

该指数变量保存了你是什么行数,因此它可以在地方范围或x范围使用。 该方法是非常简单和与不同范围或切片迭代器的工作原理,并且可以只用下界太被使用,如果需要的话。 干杯!



Answer 2:

从文档 :

注意:在内存中创建一个工作表,它不包含电池。 第一次访问时,它们被创建。 这样,我们不创造,将不能被访问,从而减少了内存占用的对象。

警告:由于这个特点,通过细胞滚动直接访问他们将创造他们都在内存中,即使你不为其指定值来代替。 就像是

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

将创建100×100细胞内存,白白。

然而,有一种方法来清理那些不需要的细胞,我们将看到更高版本。

我想访问的行或列的属性会造成许多细胞必须加载到内存中。 我建议只试图直接访问你所需要的细胞。

例如。

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


文章来源: iterating over a range of rows using ws.iter_rows in the optimised reader of openpyxl