如何解决使用OpenPyxl和insert_rows的MemoryError
我有一个脚本,可打开一个excel工作表(1.353 kB),根据值更新行,并根据索引插入新行。不幸的是,我收到了MemoryError。此外,该脚本正在消耗大量RAM。这是基于代码还是基于库?谢谢您的支持。
错误消息如下:
Traceback (most recent call last):
File "update_worksheet.py",line 42,in <module>
update.add_row(idx)
File "update_worksheet.py",line 30,in add_row
self.__ws.insert_rows(idx)
File ".\Python\Python38-32\lib\site-packages\openpyxl\worksheet\worksheet.py",line 713,in insert_rows
self._move_cells(min_row=idx,offset=amount,row_or_col="row")
File ".\Python\Python38-32\lib\site-packages\openpyxl\worksheet\worksheet.py",line 706,in _move_cells
self._move_cell(row,column,row_offset,col_offset)
File ".\Programs\Python\Python38-32\lib\site-packages\openpyxl\worksheet\worksheet.py",line 802,in _move_cell
self._cells[new_row,new_col] = cell
MemoryError
from openpyxl import load_workbook
import pandas as pd
import time
class UpdateWorksheet():
def __init__(self,path):
self.__wb = load_workbook(path,read_only = False)
self.__ws = self.__wb["WP_Planning"]
self.__df = pd.DataFrame(self.__ws.values)
def search_value_in_col_idx(self,search_string,col_idx=1):
try:
idx = self.__df[self.__df[col_idx]==search_string].index.item()
return idx
except ValueError:
return None
def update_status(self,row_idx,col_idx,status):
self.__ws.cell(row = row_idx,column = col_idx).value = status
def find_last_row(self,key,status):
idx = None
try:
idx = self.__df[self.__df[1]=="HMI"].index.tolist()
except ValueError:
idx = None
return idx[-1]
def add_row(self,idx):
self.__ws.insert_rows(idx)
def save_workbook(self,path):
self.__wb.save(path)
print("finish")
if __name__ == "__main__":
path = './data/TrackingSheet.xlsx'
update = UpdateWorksheet(path)
index = update.search_value_in_col_idx("PFIVEDAIEX-4244",4)
update.update_status(index,7,"Mikey")
idx = update.find_last_row("PFIVEDAIEX-4244","Fixed")
update.add_row(idx)
编辑1:
from openpyxl import load_workbook
from openpyxl import Workbook
import pandas as pd
class UpdateWorksheet():
def __init__(self,path):
self.__path = path
def load_file(self,read_only):
wb = load_workbook(self.__path,read_only)
return wb
# Search line to be updated
def search_value_in_col_idx(self,ws):
df = pd.DataFrame(ws.values)
try:
idx = df[df[col_idx]==search_string].index.item()
return idx
except ValueError:
return None
# Update line attributes
def update_status(self,status,ws):
if not row_idx is None:
ws.cell(row = row_idx,column = col_idx).value = status
# Find last row for new rows
def find_last_row(self,ws):
df = pd.DataFrame(ws.values)
idx = None
try:
idx = df[df[1]=="HMI"].index.tolist()
except ValueError:
idx = None
return idx[-1]
# Add new rows
def add_row(self,idx,ws):
if idx is not None:
ws.insert_rows(idx,5)
# Save changes made to workbook
def save_workbook(self,wb):
wb.save(self.__path)
if __name__ == "__main__":
path = './data/TrackingSheet.xlsx'
update = UpdateWorksheet(path)
wb = update.load_file(read_only=True)
idx = update.search_value_in_col_idx("PFIVEDAIEX-4244",4,wb["WP_Planning"])
last_row = update.find_last_row(wb["WP_Planning"])
wb.close()
wb = update.load_file(read_only=False)
update.update_status(idx,"Mikey",wb["WP_Planning"])
update.add_row(200,wb["WP_Planning"])
pdate.save_workbook(wb)
wb.close()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。