[英]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列組成,ABCDE第一行具有標題,因此可以忽略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行和ABCDE列,但是腳本只刪除了值為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
,這意味着將行從最后一行迭代到第一行(這樣,當刪除一行時,其余行將不會受到影響),並且有必要中斷內部循環(由於循環行被刪除,您不能再循環該行)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.