Python用pandas读取Excel文件的基础代码与参数详解

程一诺
程一诺
发布时间:2026-10-29| 8人浏览过
原创

系统讲解使用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()
Python用pandas读取Excel文件的基础代码与参数详解
图 1:从环境依赖、参数指定到内存校验的标准读取闭环

Excel网格与DataFrame的映射关系

为了让读取过程更具掌控力,需要理解Excel物理表格到DataFrame内存结构的映射逻辑。Excel工作簿(Workbook)通常由多个工作表(Worksheet)构成,每个工作表由行号(1, 2, 3...)和列标(A, B, C...)划分单元格。

当执行read_excel()时,pandas默认把第一行作为列标签(columns),把实际数据区域映射为二维数据矩阵(values),并在左侧自动生成从0开始的整型索引(Index)。如果工作表最上方包含报表标题、制表人或合并说明,直接读取会导致这些非字段文本被识别为列名,造成所有数据类型错乱为object。

Python用pandas读取Excel文件的基础代码与参数详解
图 2:Excel单元格区域到pandas二维数据矩阵的映射关系

核心参数功能详解与场景实践

在基础读取无法满足需求时,合理配置参数是精准控制数据加载的核心。以下按照定位、格式化与数据治理三个维度逐项展开。

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 ['日期', '金额']))
Python用pandas读取Excel文件的基础代码与参数详解
图 3:通过组合使用 skiprows、header、usecols 与 nrows 框定读取范围

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。
Python用pandas读取Excel文件的基础代码与参数详解
图 4:涵盖范围定位、表头筛选、数据类型与空值治理的参数决策架构

最佳实践代码模板

在企业级数据流处理中,推荐将参数组织为清晰的配置字典,这样不仅便于维护,还能使代码逻辑一目了然:

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}")

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。