使用pandas.read_excel()函数可高效读取Excel文件,需先安装pandas和openpyxl库。通过指定文件路径、sheet_name参数读取特定工作表或所有工作表,结合dtype和na_values参数控制数据类型与缺失值识别,利用skiprows、header、usecols和nrows等参数灵活选择数据范围。处理大型文件时,优化策略包括精确选取所需列、合理定义数据类型以降低内存占用,并可考虑将Excel转为CSV提升读取效率。

Python 中使用 Pandas 读取 Excel 文件,最核心且直接的方法就是利用
pandas.read_excel()
.xls
.xlsx
要开始,首先确保你已经安装了 Pandas 库,并且根据 Excel 文件格式,可能还需要安装
openpyxl
.xlsx
xlrd
.xls
openpyxl
安装方法:
pip install pandas openpyxl
读取 Excel 文件的基本步骤非常简单:
pd.read_excel()
import pandas as pd
# 假设你的Excel文件名为 'sales_data.xlsx' 并且在当前工作目录下
try:
df = pd.read_excel('sales_data.xlsx')
print("文件读取成功!前5行数据如下:")
print(df.head())
except FileNotFoundError:
print("错误:文件未找到。请检查文件路径和文件名是否正确。")
except Exception as e:
print(f"读取文件时发生错误: {e}")
# 如果是旧版 .xls 文件,可能需要 xlrd 引擎
# df_old_excel = pd.read_excel('legacy_data.xls', engine='xlrd')
# print("\n旧版Excel文件读取成功!")
# print(df_old_excel.head())这个
pd.read_excel()
立即学习“Python免费学习笔记(深入)”;
Excel 文件经常包含多个工作表(Sheet),而我们通常只关心其中一个或几个。
pd.read_excel()
sheet_name
sheet_name
None
import pandas as pd
file_path = 'multi_sheet_data.xlsx'
# 假设 multi_sheet_data.xlsx 包含 'Sheet1', 'SalesData', 'Config' 三个工作表
# 1. 读取名为 'SalesData' 的工作表
try:
df_sales = pd.read_excel(file_path, sheet_name='SalesData')
print("\n读取 'SalesData' 工作表:")
print(df_sales.head())
except Exception as e:
print(f"读取 'SalesData' 时发生错误: {e}")
# 2. 读取第一个工作表(索引为 0)
try:
df_first_sheet = pd.read_excel(file_path, sheet_name=0)
print("\n读取第一个工作表(索引 0):")
print(df_first_sheet.head())
except Exception as e:
print(f"读取第一个工作表时发生错误: {e}")
# 3. 读取所有工作表
try:
all_sheets = pd.read_excel(file_path, sheet_name=None)
print("\n读取所有工作表,结果是一个字典:")
for sheet_name, df in all_sheets.items():
print(f"--- 工作表: {sheet_name} ---")
print(df.head(2)) # 只打印前两行,避免输出过多
except Exception as e:
print(f"读取所有工作表时发生错误: {e}")
# 4. 读取指定名称的多个工作表
try:
selected_sheets = pd.read_excel(file_path, sheet_name=['SalesData', 'Config'])
print("\n读取 'SalesData' 和 'Config' 两个工作表:")
for sheet_name, df in selected_sheets.items():
print(f"--- 工作表: {sheet_name} ---")
print(df.head(2))
except Exception as e:
print(f"读取指定多个工作表时发生错误: {e}")在我看来,
sheet_name=None
数据类型和缺失值是数据清洗过程中绕不开的两个大问题,在从 Excel 读取数据时,如果不加以控制,很容易出现意想不到的错误。Pandas 提供了
dtype
na_values
数据类型 (dtype
object
dtype
dtype
缺失值 (na_values
pd.read_excel()
NaN
na_values
NaN
import pandas as pd
import numpy as np
file_path = 'data_with_issues.xlsx'
# 假设 data_with_issues.xlsx 包含:
# - 'OrderID' 列,可能被读成浮点数(如1001.0),我们希望是整数。
# - 'Price' 列,我们希望是浮点数。
# - 'Status' 列,某些单元格可能是 'N/A' 或 '-',我们希望识别为缺失值。
# - 'Notes' 列,可能有一些自定义的缺失值标记,如 '无'。
# 定义数据类型和缺失值
dtype_spec = {
'OrderID': int, # 确保 OrderID 是整数
'Price': float, # 确保 Price 是浮点数
'Quantity': 'int64', # 也可以用字符串形式
'ProductCode': str # 确保 ProductCode 是字符串
}
na_values_spec = [
'N/A', # 将 'N/A' 识别为 NaN
'-', # 将 '-' 识别为 NaN
'无', # 将 '无' 识别为 NaN
'None' # 有些 Excel 文件中 'None' 也是缺失值
]
try:
df_clean = pd.read_excel(file_path,
dtype=dtype_spec,
na_values=na_values_spec)
print("\n处理数据类型和缺失值后的 DataFrame:")
print(df_clean.head())
print("\n各列数据类型:")
print(df_clean.dtypes)
print("\n缺失值统计:")
print(df_clean.isnull().sum())
except Exception as e:
print(f"读取并处理数据时发生错误: {e}")
# 一个常见的场景是,Excel 中的整数列如果包含空白,Pandas 会自动将其转换为浮点数(如 1.0, NaN)。
# 如果我们希望保持整数类型并允许缺失值,可以使用 Pandas 的 nullable integer 类型:
# 'OrderID': pd.Int64Dtype()
# 这种类型在处理含有缺失值的整数列时非常有用。
# df_nullable_int = pd.read_excel(file_path, dtype={'OrderID': pd.Int64Dtype()})
# print("\n使用 nullable integer 后的 OrderID 类型:")
# print(df_nullable_int['OrderID'].dtype)dtype
na_values
实际的 Excel 文件往往不只是纯粹的数据表格,可能包含标题、批注、汇总行等非数据内容,或者我们只对其中一部分列感兴趣。
pd.read_excel()
skiprows
nrows
usecols
header
跳过行 (skiprows
指定表头 (header
header
header
读取指定行数 (nrows
nrows
选择特定列 (usecols
usecols
True
False
import pandas as pd
file_path = 'complex_layout_data.xlsx'
# 假设 complex_layout_data.xlsx 文件结构如下:
# - 前两行是报告标题和生成日期
# - 第 3 行是实际的列名(表头)
# - 数据从第 4 行开始
# - 我们只对 'Product', 'Quantity', 'Price' 这三列感兴趣
# - 文件可能包含很多行,但我们只想读取前 100 行数据
# 1. 跳过前两行,将第三行作为表头
try:
df_skip_header = pd.read_excel(file_path,
skiprows=2, # 跳过前2行(索引0和1)
header=0) # 跳过之后的第一行(原文件的第3行)作为表头
print("\n跳过前两行,并将第三行作为表头读取:")
print(df_skip_header.head())
except Exception as e:
print(f"读取时发生错误 (跳过行和表头): {e}")
# 2. 只读取 'Product', 'Quantity', 'Price' 三列,并限制行数
try:
df_partial = pd.read_excel(file_path,
skiprows=2,
header=0,
usecols=['Product', 'Quantity', 'Price'], # 指定列名
nrows=10) # 只读取数据的前10行
print("\n只读取指定列和前10行数据:")
print(df_partial)
except Exception as e:
print(f"读取时发生错误 (指定列和行数): {e}")
# 3. 使用列索引来指定列(假设 Product 是第2列,Quantity是第3列,Price是第4列,从0开始)
try:
df_col_index = pd.read_excel(file_path,
skiprows=2,
header=0,
usecols=[1, 2, 3], # 读取索引为1, 2, 3的列
nrows=5)
print("\n使用列索引读取指定列和前5行数据:")
print(df_col_index)
except Exception as e:
print(f"读取时发生错误 (使用列索引): {e}")
# 4. 如果 Excel 文件中存在一些不规则的行,比如中间插入了批注行,可以使用 skiprows 列表
# 假设我们要跳过第0, 1, 5行(原文件中的行号)
# df_irregular_skip = pd.read_excel(file_path, skiprows=[0, 1, 5], header=0)
# print("\n跳过不规则行后的数据:")
# print(df_irregular_skip.head())这些参数的组合使用,让
pd.read_excel()
处理小型 Excel 文件时,性能通常不是问题。但当文件大小达到几十甚至上百兆,包含几十万上百万行数据时,读取速度和内存占用就会变得很关键。虽然
pd.read_excel()
pd.read_csv()
chunksize
1. 精确指定 usecols
usecols
2. 优化数据类型 (dtype
dtype
float64
object
int32
int16
category
import pandas as pd
import time
import os
# 假设 large_data.xlsx 是一个非常大的文件
large_file_path = 'large_data.xlsx' # 请替换为你的大文件路径
# 创建一个模拟的大型Excel文件(如果不存在)
if not os.path.exists(large_file_path):
print(f"正在创建模拟大型文件 '{large_file_path}',请稍候...")
data = {
'col_int': range(1_000_000),
'col_float': [float(i) * 1.23 for i in range(1_000_000)],
'col_str_short': [f'Item_{i%100}' for i in range(1_000_000)],
'col_str_long': [f'This is a very long string for item {i}' for i in range(1_000_000)],
'col_bool': [i % 2 == 0 for i in range(1_000_000)],
'col_date': pd.to_datetime([f'2023-01-01'] * 1_000_000)
}
large_df_gen = pd.DataFrame(data)
large_df_gen.to_excel(large_file_path, index=False, engine='openpyxl')
print("模拟文件创建完成。")
else:
print(f"文件 '{large_file_path}' 已存在,跳过创建。")
# 场景1:不进行任何优化,读取所有列
print("\n--- 场景1:不优化读取所有列 ---")
start_time = time.time()
try:
df_unoptimized = pd.read_excel(large_file_path)
end_time = time.time()
print(f"读取耗时: {end_time - start_time:.2f} 秒")
print(f"DataFrame 内存占用: {df_unoptimized.memory_usage(deep=True).sum() / (1024**2):.2f} MB")
except Exception as e:
print(f"读取失败: {e}")
# 场景2:指定 usecols 和 dtype 进行优化
print("\n--- 场景2:使用 usecols 和 dtype 优化 ---")
optimized_dtype = {
'col_int': 'int32',
'col_float': 'float32',
'col_str_short': 'category', # 如果字符串重复度高,category 很有用
'col_bool': 'bool'
}
selected_cols = ['col_int', 'col_float', 'col_str_short', 'col_bool']
start_time = time.time()
try:
df_optimized = pd.read_excel(large_file_path,
usecols=selected_cols,
dtype=optimized_dtype)
end_time = time.time()
print(f"读取耗时: {end_time - start_time:.2f} 秒")
print(f"DataFrame 内存占用: {df_optimized.memory_usage(deep=True).sum() / (1024**2):.2f} MB")
except Exception as e:
print(f"读取失败: {e}")从上面的模拟测试中,你应该能直观感受到
usecols
dtype
3. 使用 nrows
read_excel
chunksize
nrows
skiprows
4. 优先使用 openpyxl
.xlsx
openpyxl
xlrd
engine='openpyxl'
5. 考虑将 Excel 转换为 CSV: 如果 Excel 文件真的非常大,并且你的数据结构相对简单(没有复杂的公式、宏等),一个非常有效的策略是先将 Excel 文件转换为 CSV 文件。Pandas 读取 CSV 文件的效率远高于 Excel,因为它不需要解析复杂的二进制或 XML 结构。你可以使用 Excel 软件手动转换,或者用
openpyxl
在我看来,处理大型数据时,数据类型和列选择的精细控制是避免内存溢出和提高效率的关键。很多时候,一个小小的
dtype
以上就是python如何使用pandas读取excel文件_pandas读取Excel文件实战教程的详细内容,更多请关注php中文网其它相关文章!
全网最新最细最实用WPS零基础入门到精通全套教程!带你真正掌握WPS办公! 内含Excel基础操作、函数设计、数据透视表等
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号