OpenPyXl-遍历单元格直到出现条件

时间:2019-01-02 22:27:00

标签: python excel openpyxl

Excel的A列包含许多具有不同值的行。示例:

613
613
613
625
625
631
631...etc

我要遍历A列,当单元格的值引用新值时,获取单元格的行。

预期结果示例: 当单元格的值更改为625时,它将返回第4行。当631、6等时。

到目前为止,这是我的代码:

from openpyxl import Workbook, load_workbook

wb = load_workbook("Workbook.xlsx")
ws = wb.active
sheet = wb["Visual Query2"]

for row in ws.iter_rows(min_row=1, max_col=1, max_row=223181):
    for cell in row::
           print(cell.row)

当单元格开始具有不同的值时,尝试捕获时我有点迷路。如果有人可以为我提供指导,我将不胜感激。谢谢。

编辑:能够利用以下方法找到临时解决方案:

wb = load_workbook("Workbook.xlsx")
ws = wb.active
sheet = wb["Sheet"]

for fila in ws.iter_rows('A2:A7'):
    for celda in fila:
        if celda.value != celda.offset(-1, 0).value:
            print(celda.row)

3 个答案:

答案 0 :(得分:1)

也许最直接的方法是使用zip,但这将需要将所有行加载到内存中并创建2个列表,如果您实际上有200万行,这可能会很棘手:

li = [1, 1, 2, 2, 3, 3, 1, 1, 2, 1, 2, 3]
print([index + 1 for index, (a, b) in enumerate(zip(li[:-1], li[1:])) if a != b])
#  [2, 4, 6, 8, 9, 10, 11]

一种更为保守的方法是“缓存”最后一个值:

li = [1, 1, 2, 2, 3, 3, 1, 1, 2, 1, 2, 3]
previous = None
for index, n in enumerate(li):
    if previous is None:
        previous = n
        continue
    if previous != n:
        print(index)
    previous = n

输出

2
4
6
8
9
10
11

答案 1 :(得分:1)

为了跟踪何时更改值,可以使用变量来记录最后一个值:

def return_first_of_kind(iterable, key):
    previous_value = None
    for value in iterable:
        if key(value) != previous_value:
            yield value
        previous_value = key(value)

您将其用作:

def cell_a_value(row):
    return row[0].value

for row in return_first_of_kind(ws.iter_rows(), key=cell_a_value):
    print(row)

我忘记了如何从openpyxl工作表行中获取第一列的值,请根据需要更新cell_a_value函数。

答案 2 :(得分:-2)

如果要在当前代码中进行尽可能少的更改,建议将最后一个值存储在每次移动到下一行时编写的某种临时变量中。您可以将当前行的国家/地区代码与上一行的国家/地区代码进行比较,如果它们不同,则可以打印该行的索引。如果行的索引不容易访问,则可以实现自己的计数器变量,该变量跟踪您所在的索引。可能会有更优雅的解决方案可用,但是它们可以工作。

这是我上面描述的实现示例:

i = 0
temp = None
for row in ws.iter_rows(min_row=1,max_col=1,max_row=223181):
    for cell in row:
        if cell.value != temp:
            print(i)
        temp = cell.value
    i += 1

您可能想使用另一种方法来首次分配临时变量。无论如何,这将打印第一个值。

获得最高支持的解决方案here为打印索引问题提供了一个更为优雅的解决方案。此外,this文档还告诉我们,有一种更干净的方式来打开和读取文件(请参阅“只读”部分)。