python - 使用 Openpyxl 进行迭代时出现 MemoryLoadError

原文 标签 python error-handling out-of-memory openpyxl

当我遍历一系列 .xlsm.xlsx文件,我正在尝试将第一张工作表复制到存储工作簿中。但是,在大约 30-40 个文件之后,我开始独家获得 MemoryError甚至一些非常小的.xlsx文件。我觉得单独打开excel文件不应该太费力。
我相信我正在保存并关闭必要的文件。但显然我在某处重载了内存。有任何想法吗?

import logging
import os
import openpyxl as xl

from copy import copy
from zipfile import BadZipFile

# Create and configure logger
LOG_FORMAT = "%(levelname)s - %(message)s"
logging.basicConfig(filename="errors.log",
                    level=logging.INFO,
                    format = LOG_FORMAT,
                    filemode ='w')
logger = logging.getLogger()


def copy_paste_sheets(sheet_giv, sheet_rec, filename_giv='', filename_rec='', start_row=1, start_col=1, end_row=None, end_col=None, offset_row=0, offset_col=0):

    if end_row == None:
        end_row = sheet_giv.max_row
    if end_col == None:
        end_col = sheet_giv.max_column


    print(f"Copying and Pasting {filename_giv} {sheet_giv} to {filename_rec}{sheet_rec}...")
    for i in range(start_row, end_row + 1):
        for j in range(start_col, end_col + 1):

            giv_cell = sheet_giv.cell(row=i, column=j)            
            rec_cell = sheet_rec.cell(row=i+offset_row, column=j+offset_col, value=giv_cell.value)

            if giv_cell.has_style:
                rec_cell.font = copy(giv_cell.font)
                rec_cell.border = copy(giv_cell.border)
                rec_cell.fill = copy(giv_cell.fill)
                rec_cell.number_format = copy(giv_cell.number_format)
                rec_cell.protection = copy(giv_cell.protection)
                rec_cell.alignment = copy(giv_cell.alignment)


def main():
    directory = r'C:\path'

rec_wb = xl.Workbook()

    for n, filename in enumerate(os.listdir(directory)):
        if filename.endswith(".xlsx") or filename.endswith(".xlsm"):
            try:
                giv_wb = xl.load_workbook(filename=os.path.join(directory, filename))
                giv_ws = giv_wb.worksheets[0]

                rec_ws = rec_wb.create_sheet(str(n), -1)
                title_cell = rec_ws.cell(row=1, column=1)
                title_cell.value = filename
                copy_paste_sheets(giv_ws, rec_ws, filename_giv=filename, end_row=50, end_col=15, offset_row=1)


            except (BadZipFile, MemoryError) as e:
                if type(e) == MemoryError:
                    e = 'MemoryError'

                print(f'No: {n} - {filename} = {e}')
                logger.error(f'No: {n} - {filename} = {e}')
    
        giv_wb.close()

        elif not filename.endswith(".xlsx") or not filename.endswith(".xlsm"):
            logger.info(f'No: {n} - {filename} = Not xlsx or xlsm file')

        rec_wb.save("output.xlsx")
        rec_wb.close()
        rec_wb =  xl.load_workbook(filename="output.xlsx")

if __name__ == "__main__":
    main()

最佳答案

我能够通过添加 gc.collect() 来解决问题到我的循环结束

关于python - 使用 Openpyxl 进行迭代时出现 MemoryLoadError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64298810/

相关文章:

c++ - Armadillo :矩阵乘法占用大量内存

python - MemoryError 与 numpy arange

python - 从 Python 中的大文件中选择部分记录的更有效方法

javascript - 我可以抑制 iframe 发生的错误吗?

powershell - 如何在Powershell中使用Pester模拟ErrorRecord?

ruby-on-rails - 尝试显示时间时出现NoMethodError

javascript - MongoDB和JavaScript堆内存不足

python - 有没有办法在进行正则表达式匹配时使用出现次数的范围?

python - sys.stdin.readlines() 背后是什么

python - 在 Python 中显示来自控制台的图像