Python 读取 Excel 常用的 8 种方法
很多朋友反映 Python 读取 Excel 速度慢、报错多,其实是方法没选对。本文整理了 8 种常见的读取方式,从基础到进阶,帮你找到最适合自己场景的方案。
一、为什么读取 Excel 会”慢”?
在正式介绍方法之前,先说清楚原因:
-
.xlsx格式是 XML 压缩包,解析开销大 -
默认引擎(openpyxl)对大文件不友好 -
读取了不必要的列和行,浪费时间 -
没有利用并行或缓存机制
换对方法,速度可以提升 5~50 倍。
二、8 种读取方法详解
方法 1:pandas.read_excel(最常用)
最基础的读取方式,适合日常中小型文件。
import pandas as pd
# 基础用法
df = pd.read_excel("data.xlsx")
# 常用参数
df = pd.read_excel(
"data.xlsx",
sheet_name="Sheet1", # 指定 Sheet 名,默认读第一个
header=0, # 第几行作为列名
index_col=None, # 指定索引列
usecols="A:D", # 只读取 A 到 D 列(省时省内存)
nrows=1000, # 只读取前 1000 行
skiprows=[0, 1], # 跳过指定行
dtype={"id": str} # 指定列的数据类型
)
💡 技巧:
usecols和nrows是提速的关键参数,按需读取可节省大量时间。
方法 2:指定 engine 引擎(提速关键)
read_excel 支持多种引擎,不同场景选不同引擎性能差异巨大。
# openpyxl:默认,支持 .xlsx,功能全但较慢
df = pd.read_excel("data.xlsx", engine="openpyxl")
# xlrd:只支持 .xls 旧格式,速度快
df = pd.read_excel("data.xls", engine="xlrd")
# calamine:速度最快,推荐大文件使用
# pip install python-calamine
df = pd.read_excel("data.xlsx", engine="calamine")
速度对比(10万行数据):
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
💡 推荐:大文件优先尝试
calamine,速度提升最明显。
方法 3:读取多个 Sheet
# 读取所有 Sheet,返回字典 {sheet名: DataFrame}
all_sheets = pd.read_excel("data.xlsx", sheet_name=None)
for name, df in all_sheets.items():
print(f"Sheet: {name}, 行数: {len(df)}")
# 读取指定多个 Sheet
sheets = pd.read_excel("data.xlsx", sheet_name=["销售数据", "库存数据"])
df_sale = sheets["销售数据"]
df_stock = sheets["库存数据"]
方法 4:openpyxl 直接操作(精细控制)
当你需要读取格式、颜色、公式等信息时,直接使用 openpyxl。
from openpyxl import load_workbook
wb = load_workbook("data.xlsx", read_only=True, data_only=True)
ws = wb.active # 获取当前激活的 Sheet
# 遍历所有行
for row in ws.iter_rows(min_row=2, values_only=True):
print(row)
# 读取单元格
value = ws["B2"].value
print(value)
wb.close()
💡
read_only=True模式内存占用更小,适合只读场景。
方法 5:xlwings 读取(支持公式计算结果)
openpyxl 读取的是公式文本,xlwings 可以读取 Excel 实际计算后的结果。
# pip install xlwings
import xlwings as xw
app = xw.App(visible=False)
wb = xw.Book("data.xlsx")
ws = wb.sheets["Sheet1"]
# 读取区域数据为列表
data = ws.range("A1:D100").value
# 转为 DataFrame
df = pd.DataFrame(data[1:], columns=data[0])
wb.close()
app.quit()
⚠️ xlwings 需要本机安装 Excel,适合 Windows/Mac 环境。
方法 6:使用 polars 读取(超大文件首选)
polars 是比 pandas 更快的数据处理库,读取大 Excel 文件表现出色。
# pip install polars fastexcel
import polars as pl
df = pl.read_excel("data.xlsx", sheet_name="Sheet1")
# 转为 pandas 继续使用
df_pd = df.to_pandas()
💡 对于百万行级别的 Excel,polars 速度比 pandas 快 3~10 倍。
方法 7:分块读取大文件
当内存不足时,分块读取是最稳妥的方案。
import pandas as pd
# 方法一:通过 skiprows + nrows 分批读取
chunk_size = 10000
chunks = []
for i in range(0, 100000, chunk_size):
chunk = pd.read_excel(
"large_data.xlsx",
skiprows=range(1, i + 1), # 跳过已读行(保留表头行0)
nrows=chunk_size
)
chunks.append(chunk)
df = pd.concat(chunks, ignore_index=True)
💡 更推荐:将 xlsx 先转为 csv,再用
pd.read_csv(chunksize=...)分块读取,性能更好。
方法 8:Excel 转 CSV 再读取(最快方案)
对于超大 Excel 文件,最快的方式是先转 CSV,再用 pandas 读取 CSV。
import subprocess
import pandas as pd
# 方式1:使用 libreoffice 转换(需安装)
subprocess.run([
"libreoffice", "--headless", "--convert-to", "csv",
"data.xlsx", "--outdir", "./"
])
df = pd.read_csv("data.csv")
# 方式2:用 openpyxl 导出 CSV
from openpyxl import load_workbook
import csv
wb = load_workbook("data.xlsx", read_only=True)
ws = wb.active
with open("data.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
for row in ws.iter_rows(values_only=True):
writer.writerow(row)
df = pd.read_csv("data.csv")
三、场景选择指南
|
|
|
|---|---|
|
|
pd.read_excel()
|
|
|
sheet_name=None
|
|
|
|
|
|
|
|
|
|
|
|
|
四、完整加速示例
import pandas as pd
import time
file = "large_data.xlsx"
# 慢的写法
t1 = time.time()
df = pd.read_excel(file)
print(f"默认读取: {time.time()-t1:.2f}s")
# 快的写法
t2 = time.time()
df = pd.read_excel(
file,
engine="calamine", # 换引擎
usecols=["日期","金额","类别"], # 只读需要的列
dtype={"金额": "float32"} # 指定类型减少转换开销
)
print(f"优化读取: {time.time()-t2:.2f}s")
以上就是 Python 读取 Excel 最常用的 8 种方法。核心原则只有一条:按需读取,选对引擎。希望对你有帮助,欢迎点赞收藏!
夜雨聆风
