最近学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)) 提前踩坑 从最后一行开始筛选。
试下效果:
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')#另存为新文件
#以上程序结束
因为你每次找到一个删一个,每删掉一个,迭代对象的长度就变小了,而迭代的的索引会跳到下一个,相当于跳过了一个。
如果循环到 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')#另存为新文件 zxc9989 发表于 2021-12-20 09:22
因为你每次找到一个删一个,每删掉一个,迭代对象的长度就变小了,而迭代的的索引会跳到下一个,相当于跳过 ...
谢谢大佬!
页:
[1]