Python分块读取大型Excel文件

文章目录


传统方法在处理大型Excel文件时可能面临内存不足的问题。以下方法通过分块读取适合处理数百MB甚至GB级别的Excel文件。

一、核心特性

内存高效:采用分块处理机制,避免一次性加载整个文件到内存

灵活配置:可自定义分块大小、工作表选择和表头设置

生成器模式:以迭代方式返回数据,适合流式处理

自动清理:正确处理文件资源,避免内存泄漏

二、使用示例

python 复制代码
import pandas as pd
from openpyxl import load_workbook
from typing import Generator, Optional


def read_excel_in_chunks(
        file_path: str,
        chunk_size: int = 1000,
        sheet_name: Optional[str] = None,
        header: Optional[int] = 0,
) -> Generator[pd.DataFrame, None, None]:
    """
    分块读取大型 Excel 文件,避免内存不足。

    Args:
        file_path (str): Excel 文件路径。
        chunk_size (int): 每块的行数(默认 1000)。
        sheet_name (str): 工作表名(默认第一个工作表)。
        header (int): 表头所在行(默认第 0 行,无表头设为 None)。

    Yields:
        pd.DataFrame: 每个分块的 DataFrame。
    """
    # 以只读模式打开 Excel 文件
    wb = load_workbook(file_path, read_only=True)

    # 选择工作表
    if sheet_name is not None:
        sheet = wb[sheet_name]
    else:
        sheet = wb.active  # 默认第一个工作表

    # 读取表头(如果有)
    headers = []
    if header is not None:
        for row in sheet.iter_rows(min_row=header + 1, max_row=header + 1, values_only=True):
            headers = list(row)

    # 分块读取数据
    chunk_data = []
    start_row = (header + 1) if header is not None else 1  # 数据起始行

    for i, row in enumerate(sheet.iter_rows(min_row=start_row, values_only=True), start=1):
        chunk_data.append(row)

        # 每积累 chunk_size 行,生成一个 DataFrame
        if i % chunk_size == 0:
            yield pd.DataFrame(chunk_data, columns=headers)
            chunk_data = []

    # 处理剩余行(不足 chunk_size 的部分)
    if chunk_data:
        yield pd.DataFrame(chunk_data, columns=headers)

    # 关闭工作簿
    wb.close()


for dfdf_chunk in read_excel_in_chunks(f'big.xlsx', chunk_size=1000):
	# 可以转换为字典列表
    data=df_chunk.to_dict(orient='records')
    ...

三、性能建议

分块大小:根据可用内存调整,通常1000-10000行/块较为合适

无表头文件:设置header=None可跳过表头解析

工作表选择:明确指定sheet_name比使用默认工作表更高效

四、适用场景

大数据量 Excel 文件处理

内存受限环境下的数据分析

数据分批导入数据库

流式数据预处理

五、相关文章

Pandas读写Excel文件

相关推荐
橙露10 分钟前
Python 对接 API:自动化拉取、清洗、入库一站式教程
开发语言·python·自动化
Omigeq16 分钟前
1.4 - 曲线生成轨迹优化算法(以BSpline和ReedsShepp为例) - Python运动规划库教程(Python Motion Planning)
开发语言·人工智能·python·算法·机器人
2301_8084143817 分钟前
自动化测试的实施
开发语言·python
无限码力21 分钟前
华为OD技术面真题 - Python开发 - 4
python·华为od·华为od技术面真题·华为od面试八股文·华为od面试真题·华为odpython开发真题·华为od技术面题目
l1t1 小时前
用wsl自带的python 3.10下载适用于3.12的pandas版本结合uv安装python 3.12模拟离线安装场景
python·pandas·uv
飞Link1 小时前
【AI大模型实战】万字长文肝透大语言模型(LLM):从底层原理解析到企业级Python项目落地
开发语言·人工智能·python·语言模型·自然语言处理
翻斗包菜1 小时前
第 03 章 Python 操作 MySQL 数据库实战全解
数据库·python·mysql
xcjbqd02 小时前
如何修改Oracle服务器默认的日期格式_NLS_DATE_FORMAT全局配置
jvm·数据库·python
yuhulkjv3352 小时前
AI导出的Excel公式失效
人工智能·ai·chatgpt·excel·豆包·deepseek·ai导出鸭
white-persist2 小时前
【vulhub spring CVE-2018-1270】CVE-2018-1270 Spring Messaging 远程命令执行漏洞 完整复现详细分析解释
java·服务器·网络·数据库·后端·python·spring