吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 994|回复: 4
收起左侧

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

[复制链接]
wuxi 发表于 2021-12-18 22:17
最近自己在学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
从最后一行开始筛选。
试下效果:

[Python] 纯文本查看 复制代码
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
因为你每次找到一个删一个,每删掉一个,迭代对象的长度就变小了,而迭代的的索引会跳到下一个,相当于跳过了一个。
[0, 1, 2, 3, 4, 5]
如果循环到 3这个位置并且删除了3,此时列表变成
[0, 1, 2, 4, 5],索引则到了5这个位置

[Python] 纯文本查看 复制代码
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
因为你每次找到一个删一个,每删掉一个,迭代对象的长度就变小了,而迭代的的索引会跳到下一个,相当于跳过 ...

谢谢大佬!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 17:31

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表