pandas如何读取Excel文件?

访客 python案例 5

Pandas如何读取Excel文件?完整实战指南与常见问题解答

目录导读

  1. Pandas读取Excel的基础方法 – 快速入门与核心参数解析
  2. 处理多Sheet与指定列/行 – 如何精准读取所需数据
  3. 数据类型与格式控制 – 避免读取后数据变形的技巧
  4. 常见错误与解决方案 – 编码、路径、引擎适配等问题
  5. 高效读取大型Excel文件 – 内存管理与分块读取策略
  6. 问答环节 – 针对用户高频问题的详细解答

Pandas读取Excel的基础方法

Pandas库提供了read_excel()函数,这是操作Excel文件最直接的方式,基本用法如下:

import pandas as pd
# 读取默认第一个Sheet
df = pd.read_excel('data.xlsx')

关键参数说明:

  • sheet_name:指定Sheet名称或索引,如sheet_name='Sheet1'sheet_name=0
  • header:指定表头行,默认第一行为列名,如果表头在第3行,可设置header=2
  • index_col:指定某列作为行索引,例如index_col='ID'
  • dtype:强制指定列的数据类型,防止自动推断错误(如把数字当字符串)。

提示:如果文件路径包含中文或特殊字符,建议使用原始字符串r'C:\路径\文件.xlsx'或双反斜杠。

处理多Sheet与指定列/行

读取所有Sheet

all_sheets = pd.read_excel('data.xlsx', sheet_name=None)  # 返回字典,键为Sheet名
for sheet_name, df in all_sheets.items():
    print(f"Sheet: {sheet_name}, 行数: {len(df)}")

只读取特定列

df = pd.read_excel('data.xlsx', usecols=['姓名', '年龄', '部门'])  # 按列名
df = pd.read_excel('data.xlsx', usecols='A:C')  # 按Excel列字母范围

跳过前N行、只读取后N行

df = pd.read_excel('data.xlsx', skiprows=5)  # 跳过前5行(包括表头)
df = pd.read_excel('data.xlsx', nrows=100)   # 只读取前100行数据

数据类型与格式控制

Excel中常见的数据类型问题:

  • 日期自动转换:使用parse_dates参数指定日期列,或直接读取后通过pd.to_datetime()转换。
  • 整数变浮点:因为Excel空单元格可能会导致整列变为float64,可通过dtype={'ID': int}强制转换,或读取后使用fillna(0).astype(int)
  • 科学计数法:如长数字显示为1.23E+10,需设置dtype=str先读取为字符串,再处理。
# 强制每列为字符串,避免类型推断
df = pd.read_excel('data.xlsx', dtype=str)
# 指定特定列类型
df = pd.read_excel('data.xlsx', dtype={'ID': str, '金额': float})

常见错误与解决方案

错误1:FileNotFoundError 文件路径错误

  • 解决:检查路径中是否存在中文空格;使用os.path.exists()先验证路径;或将Excel文件放在当前工作目录下。

错误2:ValueError: Excel file format cannot be determined Excel文件损坏或不是真正的.xlsx

  • 解决:尝试用其他引擎:pd.read_excel('file.xlsx', engine='openpyxl'),对于.xls文件需安装xlrd

错误3:部分数据被截断或显示为NaN

  • 原因:合并单元格、空行或特殊字符导致。
  • 解决df.fillna(method='ffill')向前填充;或使用keep_default_na=False保留空字符串。

错误4:内存不足读取大文件

  • 解决:使用chunksize分块读取(见下文第五节)。

高效读取大型Excel文件

当Excel文件超过几千行或列数较多时,建议采用以下策略:

分块读取(chunksize)

chunks = pd.read_excel('large_data.xlsx', chunksize=5000)
for chunk in chunks:
    # 分别处理每个小数据块
    process(chunk)

只读取需要的列

  • usecols可指定最少列,避免加载无用数据。

使用engine='calamine'(更快)

df = pd.read_excel('data.xlsx', engine='calamine')  # 需安装pandas>=2.0且使用calamine引擎

转换为CSV后操作

  • 先通过Excel宏或VBA将大文件保存为CSV,再用pd.read_csv()读取(速度提升5-10倍)。

问答环节

Q1:为什么读取Excel后,日期变成了数字(如44562)?

A:这是Excel内部存储日期的序列值,解决方案:

df['日期列'] = pd.to_datetime(df['日期列'], origin='1899-12-30', unit='D')
# 或者在读取时直接设置parse_dates
df = pd.read_excel('file.xlsx', parse_dates=['日期列'])

Q2:读取包含中文列名的Excel报错怎么办?

A:通常是因为文件编码或Python版本兼容性问题,建议:

  • read_excel()中添加encoding='utf-8'(虽然Excel默认不强制,但可尝试)。
  • 如果依旧报错,尝试将中文列名改为英文再读取。
  • 使用engine='openpyxl'可以更好地支持中文。

Q3:如何读取受密码保护的Excel文件?

A:Pandas不直接支持加密Excel,解决方法:

  1. 使用msoffcrypto-tool库先解密文件:pip install msoffcrypto-tool
  2. 解密后保存到临时文件再用Pandas读取。
  3. 或者要求对方取消密码保护再发送文件。

Q4:为什么读取后,某些列显示为object类型,而不是int或float?

A:可能该列中存在混合类型(如数字+字符串)或空值,查看df['列名'].unique()确认,如需强制类型转换,使用pd.to_numeric(..., errors='coerce'),错误值变为NaN。

Q5:读取多Sheet时,如何保证每个Sheet的数据结构一致?

A:先遍历检查:

for name, sheet_df in pd.read_excel('file.xlsx', sheet_name=None).items():
    if set(sheet_df.columns) != set(expected_columns):
        print(f"警告:工作表{name}列名不匹配")

然后在后续处理中按照统一列顺序重新排列。


Pandas读取Excel文件功能强大,只需掌握read_excel()的核心参数并注意数据类型与编码问题,就能高效处理大多数场景,对于大文件,分块读取和引擎选择是关键优化手段,如有更多疑问,欢迎在评论区留言交流。

标签: pandas read_excel

抱歉,评论功能暂时关闭!