解决python执行较大excel文件openpyxl慢问题

yizhihongxing

以下是关于解决Python执行较大Excel文件openpyxl慢的完整实例教程:

问题描述

当我们使用Python的openpyxl库读取或处理较大的Excel文件时,往往会遇到执行缓慢或卡死的问题。这是由于openpyxl库读取Excel文件时需要将整个文件读入内存中,导致内存占用过大,CPU占用率剧增,从而影响程序的执行效率和响应速度。

解决方案

1. 使用read_only模式

openpyxl库提供了一种read_only模式,该模式可以在打开Excel文件时只读取必要的单元格数据,省去了读取整个文件的过程,可以大大提高程序的执行效率和响应速度。

import openpyxl

# 打开Excel文件,使用read_only模式
workbook = openpyxl.load_workbook(filename='path/to/excel_file.xlsx', read_only=True)

# 使用worksheet.iter_rows()方法读取单元格数据

# 关闭Workbook对象
workbook.close()

2. 分割Excel文件

如果Excel文件过大,超出了Python内存能力范围,可以将文件按行或列分割为多个文件,然后分别处理。下面是一个按行分割Excel文件的示例:

from openpyxl import load_workbook
from openpyxl.utils import range_boundaries

# 定义每个文件的最大行数
batch_size = 1000

# 打开Excel文件
wb = load_workbook('path/to/excel_file.xlsx')

# 获取第一个worksheet对象
ws = wb.worksheets[0]

# 获取打开文件的范围,即worksheet的行列数
min_row, min_col, max_row, max_col = range_boundaries(ws.dimensions)

# 计算需要分割的文件数量
batch_count = (max_row - min_row) // batch_size + 1

# 遍历每个文件并读取数据
for batch_index in range(batch_count):
    # 计算当前文件的起始行和结束行
    start_row = min_row + batch_index * batch_size + 1
    end_row = min_row + (batch_index + 1) * batch_size

    # 创建新的Excel文件
    new_wb = Workbook()

    # 获取worksheet对象
    new_ws = new_wb.active

    # 遍历行并复制单元格数据到新的worksheet中
    for row in ws.iter_rows(min_row=start_row, min_col=min_col, max_row=end_row, max_col=max_col):
        row_data = [cell.value for cell in row]
        new_ws.append(row_data)

    # 保存新的Excel文件
    new_wb.save('path/to/new_excel_file_{}.xlsx'.format(batch_index + 1))

示例说明

示例1:使用read_only模式读取数据

下面是一个使用read_only模式读取Excel文件数据的示例代码:

import openpyxl

# 打开Excel文件,使用read_only模式
workbook = openpyxl.load_workbook(filename='path/to/excel_file.xlsx', read_only=True)

# 获取第一个worksheet对象
worksheet = workbook.worksheets[0]

# 遍历单元格并读取数据
for row in worksheet.iter_rows(min_row=1, min_col=1, max_row=1000, max_col=10):
    for cell in row:
        # 处理单元格数据
        print(cell.value)

# 关闭Workbook对象
workbook.close()

使用read_only模式可以大大提高程序的响应速度和执行效率。

示例2:按行分割Excel文件

下面是一个按行分割Excel文件的示例,将一个10000行的Excel文件分割为10个文件,每个文件包含1000行数据:

from openpyxl import load_workbook
from openpyxl.utils import range_boundaries

# 定义每个文件的最大行数
batch_size = 1000

# 打开Excel文件
wb = load_workbook('path/to/excel_file.xlsx')

# 获取第一个worksheet对象
ws = wb.worksheets[0]

# 获取打开文件的范围,即worksheet的行列数
min_row, min_col, max_row, max_col = range_boundaries(ws.dimensions)

# 计算需要分割的文件数量
batch_count = (max_row - min_row) // batch_size + 1

# 遍历每个文件并读取数据
for batch_index in range(batch_count):
    # 计算当前文件的起始行和结束行
    start_row = min_row + batch_index * batch_size + 1
    end_row = min_row + (batch_index + 1) * batch_size

    # 创建新的Excel文件
    new_wb = Workbook()

    # 获取worksheet对象
    new_ws = new_wb.active

    # 遍历行并复制单元格数据到新的worksheet中
    for row in ws.iter_rows(min_row=start_row, min_col=min_col, max_row=end_row, max_col=max_col):
        row_data = [cell.value for cell in row]
        new_ws.append(row_data)

    # 保存新的Excel文件
    new_wb.save('path/to/new_excel_file_{}.xlsx'.format(batch_index + 1))

上述示例将一个较大的Excel文件按行分割成多个文件处理,并且使用openpyxl库提供的iter_rows()方法读取单元格数据,这种方法可以大大提高程序的执行效率和响应速度。

希望以上内容对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:解决python执行较大excel文件openpyxl慢问题 - Python技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • 如何使用Python在MySQL中使用限制查询?

    在MySQL中,可以使用LIMIT子句对查询结果进行限制。在Python中,可以使用MySQL连接来执行限制查询。以下是在Python中使用限制查询的完整攻略,包括限制查询的基本语法、使用限制查询的示例以如在Python中使用限制查询。 限制查询的基本语法 限制查询的基本语法如下: column_name) FROM table_name LIMIT num…

    python 2023年5月12日
    00
  • 10个杀手级应用的Python自动化脚本

    10个杀手级应用的Python自动化脚本攻略 Python是一种功能强大、易于学习的编程语言,广泛应用于Web开发、数据科学和人工智能等领域。它还可以用于自动化任务,简化重复性工作,提高工作效率。在本篇文章中,我们将讨论10个杀手级的Python自动化脚本应用,这些应用可以使你的工作更轻松、更愉快。 1. 自动发送邮件 Python可以使用smtplib和e…

    python 2023年5月19日
    00
  • python实现TF-IDF算法解析

    Python实现TF-IDF算法解析 什么是TF-IDF算法? TF-IDF算法是一种用于信息检索和文本挖掘的常用算法,全称为Term Frequency-Inverse Document Frequency(词频-逆文档频率),是一种统计方法。TF-IDF是根据一个词在文本中出现的频率以及在文档集中出现的频率来计算该词的权重。它的主要思想是:一个词在一篇文…

    python 2023年5月20日
    00
  • Python解决多进程间访问效率低的方法总结

    我为你详细讲解“Python解决多进程间访问效率低的方法总结”的完整攻略。 什么是多进程间访问效率低的问题? 在使用Python进行多进程编程时,我们经常会遇到多个进程之间需要共享数据的情况。但是,多进程之间的数据共享涉及到了进程之间的通信问题,进程通信又与操作系统的调度和内存管理密切相关。因此,多进程间数据共享往往会导致访问效率低下,程序性能受到很大影响。…

    python 2023年5月19日
    00
  • Python实现包含min函数的栈

    以下是“Python实现包含min函数的栈”的完整攻略: 一、问题描述 设计一个支持push、pop、top和min操作的栈。其中,min操作返回栈中最小的元素。要求所有操作的时间复杂度都为O(1)。 二、解决方案 2.1 栈的基本操作 栈是一种后进先出(LIFO)的数据结构,支持以下基本操作: push(x):将元素x压入栈中。 pop():弹出栈顶元素。…

    python 2023年5月14日
    00
  • python实现kMeans算法

    Python实现kMeans算法的完整攻略 kMeans算法是一种常用的聚类算法,用于将数据集分成k个簇。本文将详细讲解Python实现kMeans算法的整个攻略,包括算法原理、实现过程和示例。 算法原理 kMeans算法的基本思想是将数据集分成k个簇,每个包含距离最近的数据。在Python中,可以使用scikit-learn库来实现kMeans算法。 具体…

    python 2023年5月14日
    00
  • Python使用Beautiful Soup实现解析网页

    Python使用Beautiful Soup实现解析网页 本文将介绍如何使用Python的Beautiful Soup库解析网页。我们将使用Beautiful Soup库解析HTML文档,并使用find()和find_all()方法查找元素。 解析HTML文档 以下是一个示例代码,演示如何使用Python的Beautiful Soup库解析HTML文档: f…

    python 2023年5月15日
    00
  • 基于python实现雪花算法过程详解

    雪花算法(Snowflake)是一种分布式ID生成算法,它可以生成全局唯一的ID。在本文中,我们将介绍如何使用Python实现雪花算法。 雪花算法原理 雪花算法生成的ID由64位组成,其中第1位是符号位,固定为0,后面的41位是时间戳,精确到毫秒级别,可以使用69年,接下来的10位是机器ID,可以部署1024台机器,最后的12位是序列号,可以在同一毫秒内生成…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部