我正在做的整个项目是,我使用openpxyl从excel文档的特定行和列中取值,然后在网页上填写表单。我填写表单,然后保存它,然后用excel文档中的下一行值填写下一个表单。
Excel的外观如下所示:
First Name Last Name DOB
George Hill 9/9/99
Sam Genius 8/8/88
Bill Smith 7/7/77
我想运行下面的函数三次,每次运行时打印出下一行:
def AddFirstName():
for i in range(3):
for row in ws.iter_rows(min_row=1, min_col=1, max_row=3,max_col=1):
for cell in row:
print(cell.value)
break
break # Tried to use breaks to break the loop so it only prints once for each loop
AddFirstName()
AddFirstName()
AddFirstName()
或者在函数外运行,如下所示:
for i in range(3):
for row in ws.iter_rows(min_row=1, min_col=1, max_row=3,max_col=1):
for cell in row:
print(cell.value)
break
break # Tried to use breaks to break the loop so it only prints once for each loop
这将打印:
George
George
George
如何修复此问题,以便打印:
George
Sam
Bill
2条答案
按热度按时间qjp7pelc1#
我找到的答案是here
基本上,它将打印出我希望在运行函数的次数上挂起的行数。
wecizke32#
我编辑了我的答案的基础上,你的意见和你正在寻找完成。
此解决方案利用闭包。闭包是嵌套函数,其中外部函数def封装内部函数def,并且外部函数返回内部函数。在内部函数中声明为非局部的变量在调用方命名空间中内部函数的调用之间保持其值。在此示例中,内部函数有两个非局部变量。2一个跟踪处理的总行数,另一个是迭代器的副本。
对于你的例子来说,一个闭包可能看起来需要做很多工作,但是我认为它会让你的代码在长期运行中更易移植和使用。处理N行的所有智能都在内部函数中。在那里修改它,闭包行为的所有"示例"也会更新。
另外,我使用unittest.mock.sentinel代替了"try",因为它比try输入的内容少很多......而且,它看起来更干净。
下面是上述脚本的输出:
h小时,
David