使用 openpyxl 从大文件中删除行
Deleting rows from a large file using openpyxl
我正在使用 openpyxl 处理一个 .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。我用我的 10 万件物品这样做 excel .
在循环中删除行可能会很慢,因为 openpyxl 必须更新被删除行下方的所有单元格。因此,您应该尽可能少地这样做。一种方法是收集行号列表,检查连续组,然后使用此列表从底部删除。
更好的方法可能是遍历 ws.values
并写入新作品sheet 过滤掉相关行。复制任何其他相关数据,例如格式等。然后您可以删除原始作品sheet并重命名新作品。
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 数据框中,进行更改,然后写入新的 sheet.
我正在使用 openpyxl 处理一个 .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。我用我的 10 万件物品这样做 excel .
在循环中删除行可能会很慢,因为 openpyxl 必须更新被删除行下方的所有单元格。因此,您应该尽可能少地这样做。一种方法是收集行号列表,检查连续组,然后使用此列表从底部删除。
更好的方法可能是遍历 ws.values
并写入新作品sheet 过滤掉相关行。复制任何其他相关数据,例如格式等。然后您可以删除原始作品sheet并重命名新作品。
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 数据框中,进行更改,然后写入新的 sheet.