我需要阅读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)
有下界,最简单的解决办法是这样的:
# 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范围使用。 该方法是非常简单和与不同范围或切片迭代器的工作原理,并且可以只用下界太被使用,如果需要的话。 干杯!
从文档 :
注意:在内存中创建一个工作表,它不包含电池。 第一次访问时,它们被创建。 这样,我们不创造,将不能被访问,从而减少了内存占用的对象。
警告:由于这个特点,通过细胞滚动直接访问他们将创造他们都在内存中,即使你不为其指定值来代替。 就像是
>>> 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