繁体   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