簡體   English   中英

使用 openpyxl 從大文件中刪除行

[英]Deleting rows from a large file using openpyxl

我正在使用 openpyxl 處理 a.xlsx 文件,該文件包含大約 10K 產品,其中一些是“常規物品”,有些是需要在需要時訂購的產品。 對於我正在做的項目,我想刪除所有包含需要訂購的項目的行。

我用實際工作簿的小樣本量對此進行了測試,並且確實讓代碼按照我想要的方式工作。 但是,當我在具有 10K 行的實際工作簿中嘗試此操作時,似乎需要永遠刪除這些行(它已經運行了將近一個小時)。

這是我使用的代碼:

wb = openpyxl.load_workbook('prod.xlsx')
sheet = wb.get_sheet_by_name('Sheet1')
def clean_workbook():
    for row in sheet:
        for cell in row:
            if cell.value == 'ordered':
                sheet.delete_rows(cell.row)

我想知道是否有一種更快的方法可以通過我的代碼中的一些調整來做到這一點? 或者有沒有更好的方法來只從工作簿中讀取常規庫存而不刪除不需要的項目?

您可以以只讀模式打開,並將所有內容導入列表,然后在列表中修改總是比在 excel 中工作快很多。 修改列表后,制作一個新工作表並將您的列表上傳回 excel。 我用我的 100k 個項目 excel 這樣做了。

刪除循環中的行可能會很慢,因為 openpyxl 必須更新被刪除行下方的所有單元格。 因此,您應該盡可能少地執行此操作。 一種方法是收集行號列表,檢查連續組,然后使用此列表從底部刪除。

更好的方法可能是遍歷ws.values並寫入過濾掉相關行的新工作表。 復制任何其他相關數據,例如格式等。然后您可以刪除原始工作表並重命名新工作表。

ws1 = wb['My Sheet']
ws2 = wb.create_sheet('My Sheet New')

for row in ws1.values:
    if row[x] == "ordered": # we can assume this is always the same column
       continue
    ws2.append(row)

del wb["My Sheet"]
ws2.title = "My Sheet"

對於更復雜的過濾,您可能希望將值加載到 Pandas dataframe 中,進行更改,然后寫入新工作表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM