Python處理超大Excel文件(GB級(jí))的完全指南
在數(shù)據(jù)分析的日常工作中,我們經(jīng)常會(huì)遇到一個(gè)令人頭疼的問題:Excel文件太大了。當(dāng)你試圖打開一個(gè)幾百兆甚至上GB的 .xlsx 文件時(shí),電腦風(fēng)扇狂轉(zhuǎn),Excel界面顯示“未響應(yīng)”,最后甚至直接導(dǎo)致內(nèi)存溢出(Out of Memory)而崩潰。
作為初學(xué)者,你可能會(huì)問:“Python能解決這個(gè)問題嗎?”
答案是肯定的。Python 不僅能處理 Excel 無法打開的文件,而且處理速度更快、更自動(dòng)化。本文將手把手教你如何使用 Python 優(yōu)雅地“吃掉”這些數(shù)據(jù)巨獸。
1. 核心概念:為什么 Excel 會(huì)卡死
在開始寫代碼之前,我們需要理解一個(gè)概念:內(nèi)存(RAM) vs 硬盤。
- Excel 的邏輯:當(dāng)你雙擊打開文件時(shí),Excel 試圖將所有數(shù)據(jù)一次性全部加載到電腦的內(nèi)存條中。如果文件大小超過了可用內(nèi)存,電腦就會(huì)卡死。
- Python 的邏輯:Python(通過特定的庫)可以采用 “流式處理”(Streaming) 或 “分塊讀取”(Chunking) 的方式。它不需要一次性把整個(gè)文件讀入內(nèi)存,而是像流水線一樣,每次只讀一小部分,處理完后再讀下一部分。
2. 準(zhǔn)備工作 (Prerequisites)
在開始之前,請確保你的環(huán)境已經(jīng)準(zhǔn)備就緒。
安裝必要的庫
我們需要用到數(shù)據(jù)分析領(lǐng)域的瑞士軍刀 pandas,以及專門用于讀取 Excel 文件的引擎 openpyxl。
打開你的終端(Terminal 或 CMD),運(yùn)行以下命令:
pip install pandas openpyxl
如果你追求極致速度(進(jìn)階),建議安裝 polars(后文會(huì)介紹):
pip install polars fastexcel
3. 實(shí)戰(zhàn)指南:處理超大 Excel 的三種方案
我們將由淺入深,介紹三種處理方案。
方案一:分塊讀取(Chunking)—— 最經(jīng)典的 Pandas 方法
這是最適合初學(xué)者的方案。我們使用 pandas 的 chunksize 參數(shù)。
場景:你有一個(gè) 1GB 的銷售記錄文件 sales_data.xlsx,你需要計(jì)算所有訂單的總銷售額。
代碼實(shí)現(xiàn):
import pandas as pd
# 設(shè)定文件路徑
file_path = 'sales_data.xlsx'
# 設(shè)定每塊讀取的行數(shù),例如每次讀 10,000 行
chunk_size = 10000
# 初始化一個(gè)變量來存儲(chǔ)總銷售額
total_sales = 0
print("開始處理數(shù)據(jù)...")
# 使用 context manager (with 語句) 讀取文件
# engine='openpyxl' 是讀取 xlsx 文件的標(biāo)準(zhǔn)引擎
with pd.read_excel(file_path, chunksize=chunk_size, engine='openpyxl') as reader:
# reader 是一個(gè)迭代器,我們通過循環(huán)每次拿出一塊(chunk)
for i, chunk in enumerate(reader):
# chunk 就是一個(gè)小型的 DataFrame,只包含 10,000 行數(shù)據(jù)
# 假設(shè)我們要匯總 'Amount' 這一列
chunk_sum = chunk['Amount'].sum()
total_sales += chunk_sum
# 打印進(jìn)度(可選)
print(f"正在處理第 {i+1} 塊數(shù)據(jù),當(dāng)前塊總額: {chunk_sum}")
print(f"處理完成!所有訂單的總銷售額為: {total_sales}")
原理解析:這段代碼永遠(yuǎn)不會(huì)占用超過 10,000 行數(shù)據(jù)所需的內(nèi)存。即使文件有 1 億行,只要你有耐心,它都能跑完。
方案二:只讀取需要的列 —— 極簡主義
很多時(shí)候,大文件里有 100 列數(shù)據(jù),但你只需要其中的 3 列。不要讀取你不需要的數(shù)據(jù),這是節(jié)省內(nèi)存的黃金法則。
代碼實(shí)現(xiàn):
import pandas as pd
# usecols 參數(shù)指定我們需要的列名或索引
# 假設(shè)我們只需要 'Date', 'Product', 'Amount' 這三列
needed_columns = ['Date', 'Product', 'Amount']
print("正在讀取特定列...")
df = pd.read_excel('sales_data.xlsx', usecols=needed_columns, engine='openpyxl')
print("讀取成功!")
print(df.head()) # 查看前5行
優(yōu)勢:極大地減少了內(nèi)存占用,速度也會(huì)提升。
方案三:格式轉(zhuǎn)換 —— 一勞永逸的專業(yè)做法 (強(qiáng)烈推薦)
這是業(yè)內(nèi)處理大數(shù)據(jù)的標(biāo)準(zhǔn)流程。
Excel (.xlsx) 本質(zhì)上是一個(gè)壓縮的 XML 文件包,解析它非常慢。如果你需要反復(fù)分析這個(gè)數(shù)據(jù),最好的辦法是只痛一次:將它轉(zhuǎn)換為更高效的格式,如 Parquet 或 CSV。
Parquet: 讀取速度比 Excel 快幾十倍,且占用空間極小。
步驟 1:將 Excel 轉(zhuǎn)為 Parquet (結(jié)合分塊)
import pandas as pd
import os
file_path = 'sales_data.xlsx'
parquet_file = 'sales_data.parquet'
chunk_size = 50000
# 如果文件存在先刪除,避免追加重復(fù)數(shù)據(jù)
if os.path.exists(parquet_file):
os.remove(parquet_file)
print("正在進(jìn)行格式轉(zhuǎn)換...")
with pd.read_excel(file_path, chunksize=chunk_size, engine='openpyxl') as reader:
for i, chunk in enumerate(reader):
# 將每一塊追加寫入 Parquet 文件
# 注意:首次寫入需要?jiǎng)?chuàng)建,后續(xù)是追加。
# 這里為了演示簡單,我們使用 fastparquet 或 pyarrow
# 但追加寫入 Parquet 稍微復(fù)雜,初學(xué)者建議先轉(zhuǎn) CSV 再轉(zhuǎn) Parquet
# 下面演示最通用的:轉(zhuǎn)為 CSV
mode = 'a' if i > 0 else 'w' # 第一次是寫入(w),之后是追加(a)
header = (i == 0) # 只有第一塊需要寫表頭
chunk.to_csv('sales_data.csv', mode=mode, header=header, index=False)
print(f"已轉(zhuǎn)換第 {i+1} 塊")
print("轉(zhuǎn)換完成!現(xiàn)在你可以飛快地讀取 CSV 了。")
步驟 2:極速讀取
一旦轉(zhuǎn)為 CSV 或 Parquet,你就可以直接秒讀了:
# 讀取 CSV 比 Excel 快得多
df = pd.read_csv('sales_data.csv')
print("數(shù)據(jù)加載完畢!")
4. 進(jìn)階方案:使用 Polars (性能怪獸)
如果你覺得 Pandas 還是不夠快,Python 社區(qū)的新星 Polars 是目前最快的數(shù)據(jù)處理庫。它底層使用 Rust 編寫,專門為多線程和高性能設(shè)計(jì)。
代碼實(shí)現(xiàn):
import polars as pl
print("使用 Polars 引擎啟動(dòng)...")
# Polars 讀取 Excel 通常比 Pandas 快,因?yàn)樗С侄嗑€程
# 且它具有 'Lazy API' (惰性計(jì)算) 的特性
df = pl.read_excel("sales_data.xlsx")
# 進(jìn)行一些聚合計(jì)算
result = df.select(
pl.col("Amount").sum()
)
print(result)
注意:對(duì)于特別巨大的 Excel,Polars 配合 fastexcel 引擎效果最佳。
5. 常見陷阱 (Common Pitfalls)
在處理大文件時(shí),新手容易犯以下錯(cuò)誤:
- 試圖
print(df)整個(gè)數(shù)據(jù)框:不要在控制臺(tái)打印幾百萬行數(shù)據(jù),這會(huì)卡死你的編輯器。永遠(yuǎn)使用df.head()查看前幾行。 - 忽略數(shù)據(jù)類型:Excel 中的數(shù)字列可能混入了文本(比如 “N/A”),導(dǎo)致 Python 把它識(shí)別為字符串。在計(jì)算前,務(wù)必檢查
df.dtypes。 - 盲目使用 Pandas 默認(rèn)設(shè)置:
read_excel默認(rèn)是非常慢的。對(duì)于大文件,必須使用chunksize或者先轉(zhuǎn)換格式。 - 電腦配置過低:雖然 Python 能優(yōu)化內(nèi)存,但如果你的電腦只有 4GB 內(nèi)存且運(yùn)行著幾十個(gè) Chrome 標(biāo)簽頁,處理 GB 級(jí)文件依然會(huì)很吃力。關(guān)閉不必要的軟件。
6. 總結(jié)與建議
處理超大 Excel 文件不再是噩夢。作為初學(xué)者,建議按照以下路徑進(jìn)階:
- 入門:使用
pandas的chunksize參數(shù),分批次循環(huán)處理數(shù)據(jù)。 - 優(yōu)化:養(yǎng)成“只讀所需列”的好習(xí)慣 (
usecols)。 - 專業(yè):將低效的
.xlsx文件第一時(shí)間轉(zhuǎn)換為.csv或.parquet,將數(shù)據(jù)清洗和數(shù)據(jù)存儲(chǔ)分開。 - 探索:嘗試使用
Polars庫,體驗(yàn)極速數(shù)據(jù)處理。
記?。篍xcel 是用來展示數(shù)據(jù)的,而不是用來存儲(chǔ)海量數(shù)據(jù)的。用 Python 做數(shù)據(jù)處理,讓 Excel 回歸報(bào)表展示,這才是專業(yè)數(shù)據(jù)分析師的工作流。
以上就是Python處理超大Excel文件(GB級(jí))的完全指南的詳細(xì)內(nèi)容,更多關(guān)于Python處理超大文件的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python cx_Oracle的基礎(chǔ)使用方法(連接和增刪改查)
這篇文章主要給大家介紹了關(guān)于python cx_Oracle的基礎(chǔ)使用方法,其中包括連接、增刪改查等基本操作,并給大家分享了python 連接Oracle 亂碼問題的解決方法,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11
Anaconda虛擬環(huán)境中安裝cudatoolkit和cudnn包并配置pytorch-gpu的配置教程
這篇文章詳細(xì)介紹了如何在Anaconda虛擬環(huán)境中安裝和配置TensorFlow,特別是針對(duì)CUDA和cuDNN的版本管理,文章首先解釋了為什么需要更新TensorFlow版本,然后指導(dǎo)如何創(chuàng)建新的虛擬環(huán)境,需要的朋友可以參考下2025-02-02
python爬取網(wǎng)易云音樂熱歌榜實(shí)例代碼
在本篇文章里小編給大家整理的是關(guān)于python爬取網(wǎng)易云音樂熱歌榜實(shí)例代碼,需要的朋友們可以學(xué)習(xí)下。2020-08-08
Python網(wǎng)絡(luò)請求庫requests的10個(gè)基本用法
今天我們要聊聊Python中非常實(shí)用的一個(gè)庫——requests,這個(gè)庫讓發(fā)送HTTP請求變得超級(jí)簡單,無論你是想抓取網(wǎng)頁數(shù)據(jù)還是測試API接口,requests都能派上大用場,下面我們就一起來看看如何使用requests完成一些常見的任務(wù),需要的朋友可以參考下2024-10-10
Python中列表獲取元素下標(biāo)的方法小結(jié)
Python獲取列表下標(biāo)的方法包括.index()、enumerate()、列表推導(dǎo)式、range()及numpy/pandas庫,適用于不同場景,本文通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下2025-08-08
Python?copy()與deepcopy()方法之間有什么區(qū)別
這篇文章主要介紹了Python中的copy()和deepcopy(),下面詳細(xì)介紹該內(nèi)容并附上詳細(xì)代碼,需要的朋友可以參考一下文章的具體內(nèi)容,希望對(duì)你有所幫助2022-10-10
Python自動(dòng)化之批量生成含指定數(shù)據(jù)的word文檔
在平時(shí)工作當(dāng)中,經(jīng)常需要處理文件,特別是Word,我們常常會(huì)機(jī)械的重復(fù)打開、修改、保存文檔等一系列操作。本文將主要介紹如何通過Python批量生成含指定數(shù)據(jù)的word文檔,感興趣的同學(xué)可以來看一看2021-11-11
Python使用Paramiko模塊編寫腳本進(jìn)行遠(yuǎn)程服務(wù)器操作
這篇文章主要介紹了Python使用Paramiko模塊編寫腳本進(jìn)行遠(yuǎn)程服務(wù)器操作的實(shí)例,通過Paramiko能夠方便地使用SSH服務(wù),需要的朋友可以參考下2016-05-05

