如何在使用.iter_rows时获取“当前”行值?

时间:2019-10-09 19:10:50

标签: python openpyxl

我正在为我的研究小组开发一个访问控制系统,并且在使用数据库对用户进行身份验证时遇到了困难。 我需要遍历一定数量的行(在.xlsx文件中),并检查我具有的值是否与列上的任何值匹配。如果是这样,将授予访问权限。否则,我需要打印一条错误消息。 我想知道是否有更聪明的方法可以完成这项工作,因为据我检查openpyxl文档,它没有说任何有助于在遍历行时提取当前行的值的事情。

当前,我有一种硬编码的方式来使其工作,使用辅助变量(n),该变量在迭代的每一行中都递增。每次迭代都会测试'n'等于表中的行数。如果相等,则意味着循环已到达表的末尾并且找不到用户。

# Checks if the UID was succesfully stored and is accessible
        for row in ws.iter_rows():
            if row[5].value == user.pin:
                print('Cadastro realizado com sucesso!')
                wb.close()
                del user
                break

            if n == ws.max_row:
                print('Usuário não autorizado')
                wb.close()
                gpio.output(10, gpio.LOW)
                del user
                n = 0
            n = n + 1

我一直在寻找诸如row.rowrow.value之类的替代方法,这些替代方法可让我在迭代时返回当前所在的行。

1 个答案:

答案 0 :(得分:1)

由于ws.iter_rows()返回一个可迭代对象,因此您可以在遍历工作表时使用Python内置的https://github.com/google/libphonenumber函数来获取索引。它的工作原理几乎与您当前在幕后的解决方案一样,但是使代码更简洁,更具可读性。

您的代码如下:

# Checks if the UID was succesfully stored and is accessible
    for idx, row in enumerate(ws.iter_rows()):
        if row[5].value == user.pin:
            print('Cadastro realizado com sucesso!')
            wb.close()
            del user
            break

        if idx + 1 == ws.max_row:
            print('Usuário não autorizado')
            wb.close()
            gpio.output(10, gpio.LOW)
            del user