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 是纯文本格式,读写速度极快,且没有任何格式负担。
- • 问题: 分块读取时,如果你把每一块的数据又添加到了一个全局的空列表中(如
all_data.append(chunk)),那么等循环结束时,所有数据依然全在内存里,电脑照样卡死。 - • 解决: 边读边处理,处理完立刻保存到硬盘(如追加写入 CSV),然后让 Python 自动回收内存。
4. 总结与进阶资源 (Conclusion & Resources)
总结
处理超大Excel文件的核心法则就是**“拒绝一次性加载”**。
- 1. 需要复杂数据清理和分析:使用
pandas 的 chunksize 分块读取。 - 2. 需要极低内存占用的简单提取:使用
openpyxl 的 read_only=True 逐行读取。
掌握了这两个技巧,你就正式告别了被Excel卡死的恐惧,向专业的数据处理者迈出了坚实的一步!
进阶资源推荐
如果你对数据处理的速度有极高的要求,当你熟练掌握上述内容后,可以进一步了解以下技术:
- • Polars 库: 新一代的数据处理框架,使用Rust编写,处理超大文件比 Pandas 快得多。
- • Dask 库: 支持并行计算的 Pandas 替代品,专为超出单机内存限制的巨大数据集设计。
- • CSV 格式的深入应用: 了解为什么在数据科学领域,
.csv 或 .parquet 格式比 .xlsx 更受欢迎。