解决python 使用openpyxl读写大文件的坑

  • Post category:Python

我很乐意为您讲解如何解决 Python 使用 openpyxl 读写大文件的问题。

1. 问题描述

在使用 openpyxl 读取或写入大型 Excel 文件时,可能会发现程序运行缓慢并且消耗大量内存。这是因为 openpyxl 在读写 Excel 文件时会将整个文件加载到内存中,导致内存占用过高,从而引发性能问题。

为了避免这个问题,我们可以采用以下两种方法进行优化。

2. 方法一:使用 read_only 模式读取 Excel 文件

openpyxl 提供了一个 read_only 模式,可以在读取 Excel 文件时减少内存占用。当使用 read_only 模式时,只能读取 Excel 文件的内容,但不能修改它们。

下面是读取 Excel 文件的示例代码:

from openpyxl import load_workbook

# 打开 Excel 文件,并指定使用 read_only 模式
wb = load_workbook(filename='large_excel_file.xlsx', read_only=True)

# 获取指定的 sheet
ws = wb['Sheet1']

# 循环遍历单元格并输出内容
for row in ws.rows:
    for cell in row:
        print(cell.value)

在上面的代码中,我们使用了 load_workbook() 函数来打开 Excel 文件,并传递了 read_only=True 参数来指定 read_only 模式。

3. 方法二:使用一次只读取一部分数据的方式

使用 read_only 模式可以减少内存占用,但有些情况下,我们需要对 Excel 文件进行修改,或者需要读取整个 Excel 文件的内容。此时,我们可以采用一次只读取一部分数据的方式,以避免内存占用过高。

下面是一个读取大 Excel 文件的示例代码:

from openpyxl import load_workbook

# 打开 Excel 文件,并指定使用 read_only 模式
wb = load_workbook(filename='large_excel_file.xlsx', read_only=True)

# 获取指定的 sheet
ws = wb['Sheet1']

# 获取需要读取的单元格范围
rows = ws.iter_rows(min_row=1, max_row=10000, min_col=1, max_col=10)

# 循环遍历单元格并输出内容
for row in rows:
    for cell in row:
        print(cell.value)

在上面的代码中,我们使用了 iter_rows() 方法来按需读取 Excel 文件的指定范围。通过控制 min_row、max_row、min_col 和 max_col 参数,可以只读取需要的单元格内容,避免将整个 Excel 文件加载到内存中。

相比于直接读取整个 Excel 文件,这种分块读取数据的方法,不仅能够节省内存空间,还能够提高程序的执行效率。