在for循环中删除直接元素总是会遇到问题。对于包含12行的工作表及其相应的行值,请考虑以下代码:for i in range(1, sh.max_row + 1):
print(sh.cell(row=i, column=1).value)
# 1 .. 12
现在看看开始删除内容时会发生什么:
^{pr2}$
您可以看到在i in [5, 6, 7]期间,行的移位从第6行开始,因为第5行已经被删除,使原始行6成为新行5,原始行7新行6。。。所以在i = 6的下一次迭代中,单元格实际上是从原始数据中引用第7行的值。您实际上跳过了对第6行的迭代。在
最简单的答案是使用while循环,而不是for:i = 1
while i <= sh.max_row:
print(f'i = {i}\tcell value (i, 1) is {sh.cell(row=i, column=1).value}')
if sh.cell(row=i, column=1).value in [5,6,7]:
sh.delete_rows(i, 1)
# Note the absence of incremental. Because we deleted a row, we want to stay on the same row because new data will show in the next iteration.
else:
i += 1
# Because the check failed, we can safely increment to the next row.
# i = 1 cell value (i, 1) is 1
# i = 2 cell value (i, 1) is 2
# i = 3 cell value (i, 1) is 3
# i = 4 cell value (i, 1) is 4
# i = 5 cell value (i, 1) is 5 # deleted
# i = 5 cell value (i, 1) is 6 # deleted
# i = 5 cell value (i, 1) is 7 # deleted
# i = 5 cell value (i, 1) is 8
# i = 6 cell value (i, 1) is 9
# i = 7 cell value (i, 1) is 10
# i = 8 cell value (i, 1) is 11
# i = 9 cell value (i, 1) is 12
# verify the data has been deleted
for i in range(1, sh.max_row +1):
print(sh.cell(row=i, column=1).value)
# 1
# 2
# 3
# 4
# 8
# 9
# 10
# 11
# 12
您现在可以看到,虽然i没有达到12,但是由于i=5已经处理了三次,所以每一行都被迭代。在