我遇到一个奇怪的问题,即逻辑和代码告诉我它应该可以工作,但是不能。
我的代码在
下方import shutil, sys
from distutils.version import StrictVersion
import openpyxl
from openpyxl import Workbook
from openpyxl import load_workbook
wb = load_workbook('testing.xlsx')
ws = wb.get_sheet_by_name('Sheet1')
x = ws.max_row
y = ws.max_column
for r in range(1,x+1):
for j in range(1, y+1):
d=ws.cell(row=r,column=j)
if str(d.value).lower() == "false":
ws.delete_rows(r)
wb.save("test_1.xlsx")
excel由5列A B C D E组成 第一行有标题,因此可以忽略 A2有时间,B2有名称C2有用户名,D2路径,E2包含TRUE或FALSE值
我的脚本的重点是查看所有单元格,如果找到FALSE的值,它将删除该行。 例如第10行
1999年1月1日John Smith JohnS / path / FALSE 应该将其删除,因为它包含FALSE,或更具体地说E10具有FALSE。 TRUE FALSE值仅出现在E列中,因此为了提高速度,我们可以指定仅对E列感兴趣,而对任何行都感兴趣。我已经在其他版本中做到了。
解决问题 问题是如上所述,我的测试excel总共有25行A B C D E列,但脚本仅删除了值为FALSE的5行。同样,脚本似乎随机删除了包含FALSE的行,因此在我的测试excel中,共有10行带有FALSE单元格。 用户名顺序为 t1,t2,t3,t4,t5,t6,t7,t8,t9,t10 但是该脚本刚刚被删除 t1,t3,t5,t6,t7,t9 现在看来,我似乎对逻辑及其检查奇数有疑问
编辑 看来,如果我重复循环多次,它将删除所有包含FALSE的行
当前有效的代码
import shutil, sys
from distutils.version import StrictVersion
import openpyxl
from openpyxl import Workbook
from openpyxl import load_workbook
wb = load_workbook('testing.xlsx')
ws = wb.get_sheet_by_name('Sheet1')
x = ws.max_row
y = ws.max_column
for r in range(1,x+1):
for j in range(1, y+1):
d=ws.cell(row=r,column=j)
if str(d.value).lower() == "false":
ws.delete_rows(r)
for r in range(1,x+1):
for j in range(1, y+1):
d=ws.cell(row=r,column=j)
if str(d.value).lower() == "false":
ws.delete_rows(r)
for r in range(1,x+1):
for j in range(1, y+1):
d=ws.cell(row=r,column=j)
if str(d.value).lower() == "false":
ws.delete_rows(r)
for r in range(1,x+1):
for j in range(1, y+1):
d=ws.cell(row=r,column=j)
if str(d.value).lower() == "false":
ws.delete_rows(r)
wb.save("test_1.xlsx")
它不太漂亮,所以任何提示都会受到赞赏
答案 0 :(得分:0)
您可以尝试以下操作:
from openpyxl import load_workbook
from openpyxl.workbook import Workbook
# open workbook and get active worksheet
wb = load_workbook('original.xlsx')
ws = wb.active
# extract headers from row 1
headers = [cell.value for row in ws.iter_rows(min_row=1, max_row=1) for cell in row]
# want to keep headers by default
new_rows = [headers]
# go through every row(>=2) except headers
for row in ws.iter_rows(min_row=2):
values = [cell.value for cell in row]
# create dictionary of row
row_dict = dict(zip(headers, values))
# only append if 'enabled' is True
if row_dict['enabled']:
new_rows.append(values)
# create a new workbook and sheet to write to
new_wb = Workbook()
new_ws = new_wb.active
# iterate though rows and columns of nested list
for row, line in enumerate(new_rows, start=1):
for column, cell in enumerate(line, start=1):
# write new cell to output worksheet
new_ws.cell(row=row, column=column).value = cell
# save output workbook
new_wb.save('output.xlsx')
其中给出了一个新的 output.xlsx 文件,其中删除了FALSE
列中包含enabled
的所有行。
它首先为每一行创建一个字典,如果键enabled
设置为True
,请保留该行。最后,它遍历所有行并将它们分别写回到输出文件。
答案 1 :(得分:0)
我认为这是缩进的问题,请尝试以下操作:
import shutil, sys
from distutils.version import StrictVersion
import openpyxl
from openpyxl import Workbook
from openpyxl import load_workbook
wb = load_workbook('testing.xlsx')
ws = wb.get_sheet_by_name('Sheet1')
x = ws.max_row
y = ws.max_column
for r in range(1,x+1):
for j in range(1, y+1):
d=ws.cell(row=x+1-r,column=j)
if str(d.value).lower() == "false":
ws.delete_rows(x+1-r)
break
wb.save("test_1.xlsx")
,然后将行号从r
更改为x+1-r
,这意味着从最后一行到第一行进行迭代(这样,当删除一行时,其余行将不受影响),并且有必要中断内部循环(由于删除了循环行,因此无法再循环此行)