Python用pandas读取Excel文件的基础代码与参数详解
系统讲解使用Python的pandas库读取Excel文件的基础语法、核心依赖与关键参数用法,涵盖多工作表提取、表头指定、列筛选、类型约束与空值处理等实用场景。
在Python数据处理工作中,将电子表格转换为可分析的数据表主要依赖pandas库的read_excel()函数。通过该函数,仅需一行核心代码就能加载.xlsx或.xls文件并构建为标准的DataFrame对象。然而,实际业务中的Excel表格通常包含合并单元格、说明性表头、特殊编码文本以及多工作表存储等情况,这就需要熟悉其常用参数以确保数据解析精准高效。
环境依赖与基础读取代码
pandas自身并不直接操作底层Excel二进制或XML结构,而是借助专用的解析引擎驱动数据读取。读取现代的.xlsx格式时推荐安装openpyxl;处理旧版.xls格式则需要xlrd。在项目开始前,需通过包管理工具确认依赖就绪。
# 依赖安装命令
pip install pandas openpyxl xlrd
准备好文件后,最基础的调用方式非常直接:导入pandas模块后调用pd.read_excel()并传入文件路径。以下示例演示基础读取操作与初次数据结构探查:
import pandas as pd
# 基础读取:默认加载第一个工作表,首行为表头
df = pd.read_excel('sales_data.xlsx')
# 验证读取结果
print("数据维度(行, 列):", df.shape)
print("\n前3行预览:")
print(df.head(3))
print("\n列字段与数据类型:")
df.info()
Excel网格与DataFrame的映射关系
为了让读取过程更具掌控力,需要理解Excel物理表格到DataFrame内存结构的映射逻辑。Excel工作簿(Workbook)通常由多个工作表(Worksheet)构成,每个工作表由行号(1, 2, 3...)和列标(A, B, C...)划分单元格。
当执行read_excel()时,pandas默认把第一行作为列标签(columns),把实际数据区域映射为二维数据矩阵(values),并在左侧自动生成从0开始的整型索引(Index)。如果工作表最上方包含报表标题、制表人或合并说明,直接读取会导致这些非字段文本被识别为列名,造成所有数据类型错乱为object。
核心参数功能详解与场景实践
在基础读取无法满足需求时,合理配置参数是精准控制数据加载的核心。以下按照定位、格式化与数据治理三个维度逐项展开。
1. sheet_name:指定工作表
Excel文件通常包含多个工作表。sheet_name参数用于决定加载哪一个或哪几个工作表,支持以下四种传递形式:
- 整数索引(默认0):
sheet_name=0读取第一个工作表,sheet_name=1读取第二个。 - 名称字符串:
sheet_name='财务报表'直接按工作表标签名匹配。 - 列表组合:
sheet_name=['2024Q1', '2024Q2']返回一个字典,字典的键为表名,值为对应的DataFrame。 - None:
sheet_name=None一次性读取工作簿内的全部工作表,返回“表名: DataFrame”的整本字典。
# 读取指定名称的工作表
df_finance = pd.read_excel('annual_report.xlsx', sheet_name='财务明细')
# 读取全部工作表并按需提取
all_sheets = pd.read_excel('annual_report.xlsx', sheet_name=None)
for sheet, data in all_sheets.items():
print(f"工作表【{sheet}】包含 {len(data)} 行记录")
2. header 与 names:表头定位与重命名
参数header指定哪一行作为列名,接受整数、整数列表或None:
header=0(默认):使用第1行作为列名。header=2:使用第3行作为列名,前两行数据自动被忽略。header=[0, 1]:生成多级分层列索引(MultiIndex)。header=None:明确声明源表格无表头,第一行开始就是纯数据,pandas将分配数字标签 0, 1, 2...
如果源表格原本没有列名,或者原列名带有乱码需要批量更名,可以配合names参数传递一个字符串列表:
# 表格无表头,手动赋予语义化列名
cols = ['user_id', 'user_name', 'score', 'signup_date']
df_users = pd.read_excel('raw_data.xlsx', header=None, names=cols)
3. skiprows 与 nrows:截取有效数据区域
很多业务表格在真正的数据开始前会留有制作单位、审批人或打印时间等元信息。此时使用skiprows跳过前面的多余行,再通过nrows限制提取行数:
skiprows=3:跳过前3行,从第4行开始读取。skiprows=[0, 2]:仅跳过第1行和第3行。nrows=100:仅读取前100行数据。在探索几百兆的庞大表格时,限制行数能极大加快调试速度。
4. usecols:精简读取列以节省内存
表格包含几十列但业务只需其中几列时,利用usecols仅抽取目标列,可以有效降低内存开销。该参数支持多种灵活写法:
# 方式一:列名称列表(直观稳妥)
df_part = pd.read_excel('big_data.xlsx', usecols=['工号', '实发工资'])
# 方式二:Excel 列字母范围(类似公式区域)
df_part = pd.read_excel('big_data.xlsx', usecols='A,C,E:G')
# 方式三:整数索引列表
df_part = pd.read_excel('big_data.xlsx', usecols=[0, 2, 4])
# 方式四:函数筛选(只保留包含“日期”或“金额”的列)
df_part = pd.read_excel('big_data.xlsx', usecols=lambda col: any(k in col for k in ['日期', '金额']))
5. dtype 与 parse_dates:类型约束与日期识别
在默认情况下,pandas会对每列自动推断类型。当遇到纯数字组成的工号(如 001205)或电话号码、身份证时,自动推断会将其当作数值整数,导致前导零丢失或数字被转换为科学计数法。为了避免数据失真,必须使用dtype显式固定为字符串格式:
# 显式约束特定列的数据类型
df = pd.read_excel(
'employee_info.xlsx',
dtype={'工号': str, '身份证号': str, '手机号': str},
parse_dates=['入职时间', '出生日期']
)
对于日期列,利用parse_dates参数让指定列直接解析为datetime64[ns]对象,避免后续再繁琐地调用pd.to_datetime()进行二次转换。
6. na_values 与 keep_default_na:空值自定义
业务数据中空值并不一定以空白单元格出现,常以 '-'、'N/A'、'NULL' 或 '暂无' 代替。na_values可以设定补充的空值识别集:
# 将自定义占位字符标记为 NaN
df = pd.read_excel('sales.xlsx', na_values=['--', '暂无', '缺失'])
常见问题排查与解决对策
报错排查 1:缺少引擎(Missing optional dependency 'openpyxl')
报错原因:运行环境缺少openpyxl。在某些多虚拟环境中,虽然全局安装了该包,但当前内核或虚拟环境未安装。执行 pip install openpyxl 即可修复。若需要处理古早的 .xls,务必注意 xlrd 在2.0版本后移除了对 .xlsx 的支持,读取 .xlsx 必须指定或默认使用 openpyxl。
业务异常 2:编码字段被转为浮点数或科学计数法
表现现象:源表格中的长订单号 202405001029384756 读取后变成了 2.02405e+17,尾数精度丢失。原因在于pandas优先使用64位浮点数承载长数字。解决办法是务必在 read_excel 中加入 dtype={'订单号': str},直接按原文本字符串读取。
性能瓶颈 3:几百兆大文件读取缓慢甚至内存溢出(OOM)
Excel基于XML压缩解压模型,读取耗时远高于CSV文件。对超大工作簿的优化策略为:使用 usecols 剔除不用的列;在脚本开发阶段指定 nrows=100 快速调试流程;若数据量长期巨大,建议先用自动化流程将 Excel 转为 CSV 或 Parquet 格式,再由 pandas 进行下游分析。
参数分类与选型速查
为了便于在日常开发中随时查阅,表 1 列出了 read_excel() 最常用的核心参数、数据类型、默认值与适用场景说明。
| 参数名称 | 数据类型 | 默认值 | 主要用途与场景说明 |
|---|---|---|---|
io |
str / Path / file-like | 必填 | Excel文件的相对/绝对路径、URL链接或字节流对象。 |
sheet_name |
str / int / list / None | 0 | 指定工作表。可传名称、索引(从0开始)、名称列表或None(读取全部返回字典)。 |
header |
int / list / None | 0 | 指定哪一行作为字段列名。无表头传None,多层表头传列表如[0, 1]。 |
names |
array-like | None | 自定义替换列名。当表格本身无表头或需要批量标准化列名时使用。 |
usecols |
list / str / callable | None | 指定要读取的列。支持列名列表、Excel列字母(如 'A:E')或过滤函数。 |
skiprows |
list-like / int | None | 跳过开头的无效行(如说明文字、报表头、空白行)。 |
nrows |
int | None | 仅读取前 N 行数据。多用于大文件采样和逻辑快速调试。 |
dtype |
dict / Type | None | 强制指定列数据类型。对防止工号、订单号前导0丢失非常关键。 |
parse_dates |
bool / list | False | 将指定的日期时间列解析为标准 datetime 对象。 |
na_values |
scalar / list / dict | None | 自定义需要被识别为缺失值(NaN)的占位符号(如 '--'、'无')。 |
engine |
str | None | 指定解析引擎。通常使用 'openpyxl' 处理 .xlsx,'xlrd' 处理 .xls。 |
最佳实践代码模板
在企业级数据流处理中,推荐将参数组织为清晰的配置字典,这样不仅便于维护,还能使代码逻辑一目了然:
import pandas as pd
from pathlib import Path
def load_clean_excel(file_path: str) -> pd.DataFrame:
"""
稳健读取业务Excel文件的标准化模板
"""
path = Path(file_path)
if not path.exists():
raise FileNotFoundError(f"未找到目标文件: {file_path}")
# 集中配置读取参数
read_options = {
'io': path,
'sheet_name': '明细数据',
'header': 1, # 第2行为字段列名
'usecols': ['工号', '姓名', '入职日期', '基本薪资'],
'dtype': {'工号': str}, # 保留前导零
'parse_dates': ['入职日期'], # 解析为日期类型
'na_values': ['--', '无', 'NULL'], # 补全自定义空值占位符
'engine': 'openpyxl'
}
df = pd.read_excel(**read_options)
return df
if __name__ == '__main__':
data_file = 'company_payroll.xlsx'
try:
df_payroll = load_clean_excel(data_file)
print("数据加载成功,预览前5条:")
print(df_payroll.head())
except Exception as e:
print(f"数据加载失败: {e}")
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









