当前位置:首页>python>【Python知识点6】超大Excel文件读取指南

【Python知识点6】超大Excel文件读取指南

  • 2026-10-07 01:24:44
【Python知识点6】超大Excel文件读取指南

Python知识点6:告别电脑卡死!新手必学的超大Excel文件读取指南

作为职场人或数据分析新手,你一定遇到过这样的崩溃瞬间:满怀期待地双击打开一个几百兆(MB)甚至上G的Excel文件,结果鼠标变成了“一直转圈的沙漏”,电脑风扇狂转,最后软件直接提示“无响应”甚至闪退。

这是因为传统的Excel软件或基础的Python读取方法,会尝试将整个文件一次性全部加载到电脑的运行内存(RAM)中。当文件体积超过了内存的承受能力,电脑就会“卡死”。

今天,我们将系统地学习如何使用Python优雅地处理超大Excel文件。我们将采用“化整为零”的策略,让你的旧电脑也能轻松搞定海量数据!

关注并私信给公众号:“python书籍”,可获得超高清Python办公自动化书籍《Excel Python:飞速搞定数据分析与处理》


1. 准备工作 (Prerequisites)

在开始写代码之前,我们需要准备好必要的Python运行环境和第三方库。

1.1 环境要求

  • • 已安装 Python(推荐 3.8 或以上版本)。
  • • 一个顺手的代码编辑器(如 VS Code, PyCharm 或 Jupyter Notebook)。

1.2 安装核心依赖库

我们将使用两个非常强大的Python库:pandas(用于数据分析)和 openpyxl(用于处理.xlsx格式文件)。
请打开你的命令行(Windows使用CMD或PowerShell,Mac使用终端),输入以下命令进行安装:

pip install pandas openpyxl

2. 核心教程:两种读取超大Excel的绝招 (Step-by-Step Guide)

面对超大文件,我们的核心思想只有一个:不要一口吞,要一口一口吃。在编程中,这被称为分块读取(Chunking)或流式读取(Streaming)。

方法一:使用 Pandas 的 chunksize 分块读取(最推荐)

pandas 是Python中最强大的数据处理库。通过设置 chunksize 参数,我们可以规定每次只读取固定数量的行,处理完这批数据后再读取下一批。

生活类比: 就像看一本1000页的厚书,你不需要把1000页同时摊开在桌子上,而是每次只翻开10页,看完再翻下10页。

代码示例:

import pandas as pd

# 假设你的超大文件名为 'huge_data.xlsx'
file_path = 'huge_data.xlsx'

# 定义每次读取的行数(例如每次读 10,000 行)
chunk_size = 10000

print("开始分块读取数据...")

# 记录总行数或用于数据汇总的变量
total_rows = 0

# 使用 chunksize 参数后,read_excel 会返回一个可迭代的对象
for chunk in pd.read_excel(file_path, chunksize=chunk_size, engine='openpyxl'):
# 此时的 chunk 是一个包含 10000 行数据的 DataFrame

# --- 在这里进行你的数据处理 ---
# 例如:筛选出某列中大于 100 的数据,或者统计行数
    current_chunk_rows = len(chunk)
    total_rows += current_chunk_rows

print(f"已成功处理 {current_chunk_rows} 行数据,当前累计处理: {total_rows} 行")

# 提示:你可以在这里将处理后的 chunk 追加保存到新的 CSV 文件中
# chunk.to_csv('processed_data.csv', mode='a', header=False, index=False)

print(f"读取完成!共处理了 {total_rows} 行数据。")

方法二:使用 Openpyxl 的 read_only 模式逐行读取(最省内存)

如果你只需要从Excel中提取某些特定的值,而不需要使用 pandas 进行复杂的数据分析计算,那么直接使用 openpyxl 的**只读模式(read_only=True)**是内存占用最小的方法。它会像流水线一样,读一行、处理一行、丢弃一行。

代码示例:

from openpyxl import load_workbook

file_path = 'huge_data.xlsx'

print("启用只读模式打开 Excel...")
# read_only=True 是关键,它能极大降低内存消耗
wb = load_workbook(filename=file_path, read_only=True, data_only=True)

# 选择当前活动的工作表(或者通过 wb['Sheet1'] 选择特定表)
sheet = wb.active

row_count = 0

# iter_rows() 会按需逐行生成数据
for row in sheet.iter_rows(values_only=True):
# row 是一个元组 (tuple),包含了这一行所有单元格的值
    row_count += 1

# 假设我们只打印前 5 行看看长什么样
if row_count <= 5:
print(f"第 {row_count} 行数据: {row}")

# --- 在这里编写你的业务逻辑 ---
# 例如:if row[0] == '特定值': 保存该行

print(f"读取完毕,文件共有 {row_count} 行。")

# 养成好习惯,处理完后关闭文件
wb.close()

3. 常见避坑指南 (Common Pitfalls)

新手在处理大文件时,即使掌握了上述方法,也可能掉进以下几个“坑”里:

  • • 坑点 1:chunksize 设置得太大或太小
    • • 问题: 如果设置成一百万,依然会内存溢出(OOM);如果设置成10,读取速度会慢得令人发指。
    • • 解决: 通常建议将 chunksize 设置在 10,000 到 100,000 之间。你可以根据自己电脑的内存大小进行调试。
  • • 坑点 2:处理完数据后,又保存为超大 .xlsx 文件
    • • 问题: Excel格式(.xlsx)本身包含了大量的格式、样式信息,保存极度耗时且文件体积庞大。
    • • 解决:强烈建议将处理后的大型数据保存为 .csv 格式! CSV 是纯文本格式,读写速度极快,且没有任何格式负担。
  • • 坑点 3:在循环里创建大列表(List)
    • • 问题: 分块读取时,如果你把每一块的数据又添加到了一个全局的空列表中(如 all_data.append(chunk)),那么等循环结束时,所有数据依然全在内存里,电脑照样卡死。
    • • 解决: 边读边处理,处理完立刻保存到硬盘(如追加写入 CSV),然后让 Python 自动回收内存。

4. 总结与进阶资源 (Conclusion & Resources)

总结

处理超大Excel文件的核心法则就是**“拒绝一次性加载”**。

  1. 1. 需要复杂数据清理和分析:使用 pandas 的 chunksize 分块读取。
  2. 2. 需要极低内存占用的简单提取:使用 openpyxl 的 read_only=True 逐行读取。

掌握了这两个技巧,你就正式告别了被Excel卡死的恐惧,向专业的数据处理者迈出了坚实的一步!

进阶资源推荐

如果你对数据处理的速度有极高的要求,当你熟练掌握上述内容后,可以进一步了解以下技术:

  • • Polars 库: 新一代的数据处理框架,使用Rust编写,处理超大文件比 Pandas 快得多。
  • • Dask 库: 支持并行计算的 Pandas 替代品,专为超出单机内存限制的巨大数据集设计。
  • • CSV 格式的深入应用: 了解为什么在数据科学领域,.csv 或 .parquet 格式比 .xlsx 更受欢迎。

最新文章

随机文章