OpenPyXl循环通过单元格直到条件

2024-09-28 22:00:06 发布

您现在位置:Python中文网/ 问答频道 /正文

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

613
613
613
625
625
631
631...etc

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

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

这是我目前为止的代码:

^{pr2}$

当我试图捕捉细胞开始有不同的值时,我有点不知所措。如果有人能给我指导,我会非常感激的。谢谢。在

编辑:能够找到一个临时解决方案:

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)

Tags: 代码in示例forwsvalueetcexcel
3条回答

也许最简单的方法是使用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]

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

^{pr2}$

输出

2
4
6
8
9
10
11

如果您希望在当前代码中尽可能少地更改,我建议将最后一个值存储在某种临时变量中,每次移动到下一行时都会覆盖该临时变量。将当前行的国家代码与前一行的国家代码进行比较,如果它们不同,则打印该行的索引。如果行的索引不容易访问,则可以实现自己的计数器变量来跟踪您所在的索引。可能有更优雅的解决方案,但这些都会奏效。在

下面是我上面描述的一个实现示例:

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文档告诉我们有一种更干净的方法来打开和读取文件(请参阅“只读”部分)。在

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

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)

您将其用作:

^{pr2}$

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

相关问题 更多 >