Python 读取 Excel 文件完全指南:从入门到实战

在日常的数据处理和自动化任务中,Excel 文件(.xlsx, .xls)无疑是我们最常遇到的数据格式之一。无论你是数据分析的新手,还是试图自动化报表流程的资深开发者,掌握如何使用 Python 高效地读取 Excel 数据都是一项必不可少的技能。

你可能已经厌倦了手动打开 Excel 并复制粘贴数据到其他系统中,或者你正在处理数据量过大而导致 Excel 崩溃的窘境。别担心,在这篇文章中,我们将深入探讨如何利用 Python 的强大功能来驾驭 Excel 数据。我们将不仅仅是简单地“读取”文件,还会深入理解不同库背后的工作原理,探讨性能优化,并分享许多实战中的避坑指南。

我们将重点介绍三个主流的 Python 库:pandasopenpyxlxlwings。它们各自都有独特的适用场景,了解它们的差异将帮助你在实际项目中做出最佳选择。

核心工具概览:选择合适的武器

在开始写代码之前,我们先来快速了解一下这三个“主力军”的特点,这样我们在面对具体问题时就能对号入座。

  • pandas:这是数据分析领域的“瑞士军刀”。它适合大多数需要快速加载、清洗和分析数据的场景。如果你的目标是把 Excel 变成表格形式并进行批量处理,pandas 是首选。
  • openpyxl:这是一个更底层的库,专门用于处理 .xlsx 文件。它允许我们精确控制单元格的格式、公式甚至是样式。适合需要对 Excel 文件进行精细化读写操作的场合。
  • xlwings:这是连接 Python 和 Excel 应用的桥梁。不同于前两者读取文件数据,xlwings 可以直接控制运行中的 Microsoft Excel 程序。非常适合用于编写自动化脚本,比如利用 VBA 的功能或生成动态报表。

环境准备

为了确保你能顺利运行接下来的所有示例,你需要安装上述提到的三个库。打开你的终端或命令行工具,运行以下命令:

pip install pandas openpyxl xlwings

准备测试数据

在接下来的示例中,我们将使用一个名为 student_data.xlsx 的模拟学生数据表作为演示。

该文件包含学生的姓名、编号及其他相关信息,这将帮助我们直观地看到代码运行后的效果。

!示例数据预览

方法一:使用 Pandas —— 数据分析的首选

当我们谈论 Python 读取 Excel 时,pandas 几乎总是第一个被提到的名字。它不仅强大,而且极其简洁。使用 pd.read_excel() 函数,我们可以瞬间将 Excel 表格转化为一个 DataFrame(数据框),这就像是一个在内存中运行的超强 Excel。

#### 基础用法:全量读取

让我们从最简单的示例开始:读取整个 Excel 文件。

import pandas as pd

# 将 Excel 文件读取到 DataFrame 中
df = pd.read_excel(‘student_data.xlsx‘)

# 打印数据概览
print(df)

输出结果:

!Pandas 读取结果

代码深度解析:

  • INLINECODE1423e249: 我们按照惯例将 pandas 别名为 INLINECODEe58f0053,这是社区的标准写法。
  • INLINECODE9699c6ec: 这是核心函数。它不仅支持读取 INLINECODE3cc734df,还支持 INLINECODE68b4d93f 和 INLINECODE5013d113 等多种格式。默认情况下,它会读取文件的第一个工作表(Sheet)。
  • DataFrame: 变量 df 现在包含了所有的数据。你可以把它想象成一个超级表格,支持非常复杂的数据操作。

#### 进阶实战:精细化读取

在实际工作中,Excel 文件往往很复杂,包含多个 Sheet,或者第一行并不是表头。如果我们直接读取,可能会导致数据错乱。让我们看看如何处理这些情况。

场景 1:指定特定的 Sheet 和表头行

假设我们的数据在第二个名为“Scores”的工作表中,且真正的表头在第二行(索引为 1)。

import pandas as pd

# sheet_name 参数指定工作表名称
# header 参数指定哪一行作为列名(0代表第一行,1代表第二行,None表示没有表头)
df_specific = pd.read_excel(
    ‘student_data.xlsx‘, 
    sheet_name=‘Sheet1‘,  # 或者使用索引 sheet_name=0
    header=0              # 明确指定第一行作为列名
)

# 使用 head() 方法仅查看前 5 行数据,这在数据探索时非常有用
print("前 5 行数据预览:")
print(df_specific.head()) 

场景 2:读取特定的列

如果一个 Excel 文件有 50 列,但你只关心“Name”和“ID”,那么只读取这两列可以显著节省内存。

import pandas as pd

# usecols 参数允许我们传入列名列表或列位置(如 [0, 2])
df_partial = pd.read_excel(
    ‘student_data.xlsx‘, 
    usecols=[‘Name‘, ‘ID‘] # 仅读取这两列
)

print(df_partial)

性能优化建议:

处理大型 Excel 文件时,pandas 可能会占用大量内存。如果遇到内存不足的情况,可以尝试以下两种策略:

  • 分块读取 (chunksize)

你可以将大文件切分成小块进行处理,而不是一次性加载。

    # 每次只读取 1000 行
    chunk_iter = pd.read_excel(‘large_file.xlsx‘, chunksize=1000)
    for chunk in chunk_iter:
        # 在这里对每一块数据进行处理
        process(chunk)
    
  • 指定数据类型 (dtype)

默认情况下,pandas 会猜测数据类型。如果你明确知道某列是整数或字符串,提前指定可以节省内存并提高加载速度。

    df = pd.read_excel(‘data.xlsx‘, dtype={‘ID‘: str, ‘Age‘: int})
    

方法二:使用 Openpyxl —— 细粒度控制的专家

虽然 pandas 很强大,但它有时会“黑盒”化处理数据(例如忽略格式,或无法处理合并单元格的复杂逻辑)。这时,openpyxl 就派上用场了。它允许我们像操作对象一样操作 Excel 的每一个单元格。

基础读取逻辑

openpyxl 的读取逻辑是:加载工作簿 -> 选中工作表 -> 遍历单元格。这与 pandas 的“一键加载”有很大不同。

import openpyxl

# 1. 加载工作簿对象
wb = openpyxl.load_workbook(‘student_data.xlsx‘)

# 2. 获取当前活动的工作表(通常是打开文件时显示的那张)
ws = wb.active

# 打印工作表的标题,确认我们找对了地方
print(f"正在读取工作表: {ws.title}")

逐行遍历:提取数据的稳妥方式

在处理财务报表或复杂格式的表格时,逐行读取是最安全的方式。我们可以通过 ws.iter_rows() 方法来实现。

import openpyxl

wb = openpyxl.load_workbook(‘student_data.xlsx‘)
ws = wb.active

# min_row=2 意味着我们从第二行开始读(跳过表头)
# values_only=True 让我们直接获取单元格的值,而不是单元格对象
print("逐行读取数据(跳过表头):")

for row in ws.iter_rows(min_row=2, values_only=True):
    if row[0] is not None: # 简单的检查,确保跳过空行
        print(row)

代码解释:

  • INLINECODE17ae76a8: 获取活动工作表。你也可以通过 INLINECODE6b37b0e5 来指定特定名称的表。
  • INLINECODE3e3cf19f: 这是一个极其强大的迭代器。你可以控制 INLINECODE468a29e3, INLINECODEd88bdf40, INLINECODE5268f394, max_col 来精确控制读取范围。
  • INLINECODE05c31fba: 这是一个让代码更简洁的参数。如果不加它,你得到的是 Cell 对象,还需要调用 INLINECODEb9e5f757 属性才能看到数据。

实战案例:处理公式和格式

openpyxl 最大的优势在于它能读取 Excel 的公式和样式。这在 pandas 中是很难做到的。

import openpyxl

wb = openpyxl.load_workbook(‘student_data.xlsx‘)
ws = wb.active

# 读取特定单元格 B2
cell_b2 = ws[‘B2‘]

print(f"B2 的值是: {cell_b2.value}")

# 检查单元格是否包含公式
if cell_b2.data_type == ‘f‘:
    print(f"B2 包含公式: {cell_b2.value}")
else:
    print("B2 是静态数据")

# 读取行和列的最大值(了解表格的边界)
print(f"该表格的最大行数: {ws.max_row}")
print(f"该表格的最大列数: {ws.max_column}")

常见错误与解决方案:

  • 错误openpyxl.utils.exceptions.InvalidFileException
  • 原因:你尝试用 openpyxl 去读取 .xls 格式(老版 Excel)。
  • 解决:openpyxl 仅支持 INLINECODE7fdd67b6。如果是 INLINECODE2a33d7b5,请使用 INLINECODE830f1489 库,或者先将文件另存为 INLINECODE6d7d0238。

方法三:使用 Xlwings —— 自动化与交互的利器

最后,让我们来看看 xlwings。与前两个库不同,xlwings 的独特之处在于它需要一个正在运行的 Excel 实例。这意味着你可以利用 Excel 本身的计算引擎、宏以及 VBA 功能。

这个库非常适合用于:需要与用户交互的自动化工具,或者需要保留 Excel 格式和公式的报表生成器

基础连接与读取

使用 xlwings 时,Python 和 Excel 之间的连接是实时的。

import xlwings as xw
import pandas as pd

# 这将启动一个 Excel 实例(如果尚未运行),并打开文件
# 添加 visible=True 可以让你看到 Excel 界面被打开,这在调试时很有用
wb = xw.Book(‘student_data.xlsx‘)

# 指定我们要操作的工作表
sheet = wb.sheets[‘Sheet1‘]

print("已成功连接到 Excel 应用程序。")

读取范围数据:灵活的 Range

xlwings 提供了非常直观的 range 方法来读取数据。

import xlwings as xw

wb = xw.Book(‘student_data.xlsx‘)
sheet = wb.sheets[‘Sheet1‘]

# 读取 B1 到 B7 的所有数据
# xlwings 会自动将其转换为 Python 列表
names_range = sheet.range(‘B1:B7‘).value

print("读取到的名字列表:", names_range)

# 你也可以使用索引方式,这在循环中很有用
# (1,1) 代表 A1, (2,2) 代表 B2
first_cell_value = sheet.range((1, 1)).value
print(f"A1 单元格的内容是: {first_cell_value}")

输出结果:

Names: [‘Name‘, ‘Ankit‘, ‘Rahul‘, ‘Shaurya‘, ‘Aishwarya‘, ‘Priyanka‘]

代码解释:

  • .sheets[‘Sheet1‘]: 直接操作工作表对象,非常符合 Excel 用户的心理模型。
  • .value: 这是读取属性。xlwings 非常智能,如果你读取单行或单列,它返回列表;如果你读取多行多列,它会返回一个嵌套列表。

Xlwings 的独特优势:调用 Excel 函数

这是 xlwings 最酷的地方。你可以在 Python 中直接使用 Excel 内置的复杂函数,而不需要在 Python 里重新实现算法。

import xlwings as xw

wb = xw.Book(‘student_data.xlsx‘)
sheet = wb.sheets[‘Sheet1‘]

# 假设我们在 Python 中想计算一列数据的和
# 我们可以借用 Excel 的 SUM 函数
# 注意:这里只是演示调用能力,实际操作需视数据而定
my_sum = sheet.range(‘A1‘).formula = "=SUM(A2:A10)"

# 重新读取计算后的值
result = sheet.range(‘A1‘).value
print("利用 Excel 引擎计算的结果是:", result)

注意事项:

使用 xlwings 时,请务必记得关闭连接或保存文件,否则 Excel 进程可能会在后台占用内存。

# 操作完成后,保存并关闭
wb.save()
wb.close()
# 如果不再需要,也可以退出整个应用
# app.kill()

总结:如何选择最适合你的库?

在这篇文章中,我们探讨了三种使用 Python 读取 Excel 的方法。作为开发者,选择正确的工具至关重要。让我们来总结一下它们的适用场景:

  • 首选 pandas:如果你正在进行数据分析、数据清洗,或者需要将 Excel 数据导入到数据库/机器学习模型中。它的语法最简洁,处理速度最快。
  • 深入 openpyxl:如果你需要编写脚本去修改现有 Excel 文件的格式(如加粗、颜色),处理复杂的合并单元格,或者需要在不打开 Excel 的情况下精细操作数据结构。
  • 应用 xlwings:如果你正在开发自动化办公流程(RPA),需要利用 Excel 的 VBA 宏,或者需要 Excel 界面与 Python 脚本进行实时交互。

关键要点回顾

  • Pandas 使用 INLINECODE8e6b440f 是最快速的数据加载方式,记得利用 INLINECODEa261889a 和 dtype 来优化性能。
  • Openpyxl 让你拥有单元格级别的控制权,适合处理格式和复杂结构的文件。
  • Xlwings 是唯一能与运行中的 Excel 应用程序交互的库,适合自动化任务。

现在,你已经掌握了读取 Excel 的核心技能。我们建议你尝试下载我们提供的示例数据,亲手运行上面的代码。你会发现,一旦你用 Python 接管了 Excel 数据,你的工作效率将会产生质的飞跃。

如果你想了解更多关于如何将数据写回 Excel 或自动化生成报表的高级技巧,欢迎继续关注我们的后续教程。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/34957.html
点赞
0.00 平均评分 (0% 分数) - 0