无法删除具有特定单元格值 python openpyxl 的行
Unable to remove rows with specific cell value python openpyxl
我遇到了一个奇怪的问题,逻辑和代码告诉我它应该工作,但它不工作。
我的代码在下面
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 行
01/01/1999 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")
它不漂亮所以任何提示将不胜感激
您可以尝试这样的操作:
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 文件,其中删除了 enabled
列中包含 FALSE
的所有行。
它首先为每一行创建一个字典,如果键 enabled
设置为 True
,则保留该行。最后,它遍历所有行并将它们分别写回输出文件。
我认为是缩进的问题,试试这个:
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
,这意味着从最后一行迭代到第一行(这样当删除一行时,其余行不会受到影响),并且需要打破内层循环(因为循环行被删除,不能再循环这一行)
我遇到了一个奇怪的问题,逻辑和代码告诉我它应该工作,但它不工作。
我的代码在下面
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 行
01/01/1999 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")
它不漂亮所以任何提示将不胜感激
您可以尝试这样的操作:
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 文件,其中删除了 enabled
列中包含 FALSE
的所有行。
它首先为每一行创建一个字典,如果键 enabled
设置为 True
,则保留该行。最后,它遍历所有行并将它们分别写回输出文件。
我认为是缩进的问题,试试这个:
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
,这意味着从最后一行迭代到第一行(这样当删除一行时,其余行不会受到影响),并且需要打破内层循环(因为循环行被删除,不能再循环这一行)