wuxi 发表于 2021-12-18 22:17

最近学openpyxl 删除某一列含有关键字的所有行

最近自己在学openpyxl时,遇到了一些问题,程序如下,但是结果中就删除了一半的数据,另一半数据没有被删除,我不知道为什么
求大佬教我
我的附件 https://www.lanzouq.com/it5JFxqx9kb
from openpyxl import Workbook , load_workbook
import openpyxl
wb = load_workbook('列表.xlsx',data_only=True)#载入合同
ws = wb.active
key_word = "已签约"#需要删除行里列”F“中的关键字
z = 0   #计数
for row in range(3,ws.max_row+1): # 从第3行到最后一行
    if key_word in str(ws.cell(row=row,column=6).value): #寻找第”F“列中的关键字
      print("第{}行,值是{}".format(row,ws.cell(row=row,column=6).value))#验证一下,等待的时候很无聊
      ws.delete_rows(row) #删除所在行
      z=z+1
      print("已删除第{}个".format(z))#记录一共删除多少个
wb.save('3.xlsx')#另存为新文件
#以上程序结束


#由于原表格第9行没有被删除,但是第8行被删除了,拿来做对比
if ws.cell(row=8,column=6).value == ws.cell(row = 9 ,column=6):
    print("TRUE")
else:
    print("False")#结果第8行和第9行结果不同
#查看是否为数据类型不对,或者有空格
print(ws.cell(row=8,column=6).value)
print(type(ws.cell(row=8,column=6).value),len(ws.cell(row=8,column=6).value))
print(ws.cell(row=9,column=6).value)
print(type(ws.cell(row=9,column=6).value),len(ws.cell(row=9,column=6).value))

15633738398 发表于 2021-12-19 09:18

提前踩坑

xinyangtuina 发表于 2021-12-19 14:52

从最后一行开始筛选。
试下效果:

from openpyxl import Workbook , load_workbook
import openpyxl
wb = load_workbook('列表.xlsx',data_only=True)#载入合同
ws = wb.active
key_word = "已签约"#需要删除行里列”F“中的关键字
z = ws.max_row+1   #总行数
for row in range(ws.max_row+1,1,-1): # 从最后一行到第一行,步长为-1
    if key_word in str(ws.cell(row=row,column=6).value): #寻找第”F“列中的关键字
      print("第{}行,值是{}".format(row,ws.cell(row=row,column=6).value))#验证一下,等待的时候很无聊
      ws.delete_rows(row) #删除所在行
      z=z-1
      print("已删除第{}个".format(z))#记录一共删除多少个
wb.save('3.xlsx')#另存为新文件
#以上程序结束

zxc9989 发表于 2021-12-20 09:22

因为你每次找到一个删一个,每删掉一个,迭代对象的长度就变小了,而迭代的的索引会跳到下一个,相当于跳过了一个。

如果循环到 3这个位置并且删除了3,此时列表变成
,索引则到了5这个位置

from openpyxl import load_workbook
wb = load_workbook(r"C:\Users\Administrator\Desktop\列表.xlsx",data_only=True)#载入合同
ws = wb.active
key_word = "已签约"#需要删除行里列”F“中的关键字
z, row = 3
tatol = ws.max_row
while z < tatol:
    print(f"第{z}行,值是{ws.cell(row=row, column=6).value}")#验证一下,等待的时候很无聊
    if key_word in ws.cell(row=row, column=6).value: #寻找第”F“列中的关键字
      ws.delete_rows(row) #删除所在行
    else:
      row += 1
    z += 1
print(f"已删除第{z}个")#记录一共删除多少个
wb.save('3.xlsx')#另存为新文件

wuxi 发表于 2021-12-24 11:49

zxc9989 发表于 2021-12-20 09:22
因为你每次找到一个删一个,每删掉一个,迭代对象的长度就变小了,而迭代的的索引会跳到下一个,相当于跳过 ...

谢谢大佬!
页: [1]
查看完整版本: 最近学openpyxl 删除某一列含有关键字的所有行