老齐教室

用Python读取Excel文件指南

原作者:Erik Marsja

编译者:老齐

与本文相关的图书推荐:《数据准备和特征工程》

本书适合于数据科学、机器学习、深度学习等方向的学习者阅读。书中通过案例的形式,系统阐述了数据获取、数据整理、特征工程、特征选择等方法。


本文,将重点阐述用Python如何读取Excel文件(xlsx),重点是演示使用openpyxl模块读取xlsx类型的文件。首先,我们要看一些简单的示例;然后,我们将学习读取多个Excel文件。

如果你阅读过《数据准备和特征工程》(电子工业出版社出版)这本书,就肯定知道,在书中,作者介绍了如何使用Pandas读取Excel文件。在阐述本文的同时,你所看到的书中的方法,依然有效且常用。本文的目的主要是要介绍另外一种方法,并且这种方法也有它的特点。

Openpyxl简介

openpyxl模块的官方网站是:https://openpyxl.readthedocs.io/en/stable/。这里,先演示一个简单的示例,看看在Python语言中如何用openpyxl模块读取一个xlsx文件。

1
2
3
4
5
6
7
8
import openpyxl
from pathlib import Path

xlsx_file = Path('SimData', 'play_data.xlsx')
wb_obj = openpyxl.load_workbook(xlsx_file)

# 得到当前工作表:
sheet = wb_obj.active

当然,在理解上面代码之前,你应该已经知道如何读写文件了,如果这方面尚有不足,请阅读《跟老齐学Python:轻松入门》中的有关章节。

为了能够使用openpyxl模块,请先确认,在本地已经安装了Python3和这个模块。模块的安装方法非常简单,即:pip install openpyxl,如果你使用的是conda,还可以:conda install openpyxl。注意,使用pip安装的时候,如果提示你不是最新版本,应该尽快升级,用最新版本的pip来安装。

读取单个文件

前面的代码中,已经读取了单个文件,下面我们更详细地对代码进行解读。

  1. 引入模块

读取xlsx文件的第一步,就是要引入必要的模块,这里我们引入了Path和openpyxl两个模块。

1
2
import openpyxl
from pathlib import Path

  1. 设置Excel文件路径

在这一步,我们用Path创建了一个实例,并且用变量xlsx_file引用,它包含了文件的路径和文件名称。

1
2
# Setting the path to the xlsx file:
xlsx_file = Path('SimData', 'play_data.xlsx')

注意,代码中的SimData是当前工作目录的子目录,本例中的Excel文件保存在该目录中,如果保存在了其他目录中,需要设置完整的文件路径,例如:xlsx_file = Path(Path.home(), 'Documents', 'SimData', 'play_data.xlsx'),这是将Excel文件保存到了Documents目录里面的SimData子目录中了。

  1. 读入Excel文件(工作簿)

第三步,利用load_workbook()方法读取文件:

1
wb_obj = openpyxl.load_workbook(xlsx_file)

打印输出结果说明,当前得到的是工作簿对象。

  1. 从Excel文件中读入当前工作表

一个工作簿,有多个工作表。我们能够使用的是当前的工作表,可以用下面的方式获得:

1
wsheet = wb_obj.active

如果知道了工作表名称,可以用这种方式得到指定工作表play_data = wb_obj['play_data']。这样就能够实现工作表的切换。

  1. 操作工作表

现在可以编辑工作表了,例如,用下面的方式获得指定单元格的值。

1
print(sheet["C2"].value)

再如,对于已经读取到的工作表,我们能够用循环语句获得指定行,并且把各个单元格中的值打印出来。

1
2
3
4
for row in sheet.iter_rows(max_row=6):
for cell in row:
print(cell.value, end=" ")
print()

注意,上面代码中的参数max_row,其值为6,意味着读取这个工作表的前6行。

  1. 补充:输出行和列的数量

再补充一个常用操作,就是确定Excel文件的行和列的数量。

1
print(sheet.max_row, sheet.max_column)

将读入的Excel文件保存为Python字典

把Excel文件的内容读入之后,怎么将它保存为字典对象?

有时候,你可能需要得到列的名称,下面代码就演示了如何实现这种需求。

1
2
3
4
5
6
7
8
9
10
11
12
import openpyxl
from pathlib import Path

xlsx_file = Path('SimData', 'play_data.xlsx')
wb_obj = openpyxl.load_workbook(xlsx_file)
sheet = wb_obj.active

col_names = []
for column in sheet.iter_cols(1, sheet.max_column):
col_names.append(column[0].value)

print(col_names)

为了将Excel内容保存为字典对象,当然要创建一个字典,然后就是通过循环的方式,向字典中增加相应内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
data = {}

for i, row in enumerate(sheet.iter_rows(values_only=True)):
if i == 0:
data[row[1]] = []
data[row[2]] = []
data[row[3]] = []
data[row[4]] = []
data[row[5]] = []
data[row[6]] = []

else:
data['Subject ID'].append(row[1])
data['First Name'].append(row[2])
data['Day'].append(row[3])
data['Age'].append(row[4])
data['RT'].append(row[5])
data['Gender'].append(row[6])

在上面的代码中,创建了一个字典data,然后玄幻每一行(iter_rows),并且仅仅获取该行的值。接下来使用条件语句,判断一下,如果是第一行,就增加字典的键,这其实是以键为列的名称。否则,将根据键(加Excel中的每一列)向字典中增加值。

读取多个Excel文件

下面,我们要用openpyxl模块读取多个xlsx文件。

  1. 导入模块

除了前面使用过的恋歌模块之外,增加了一个glob

1
2
3
import glob
import openpyxl
from pathlib import Path
  1. 读取目录中的所有xlsx文件

假设在子目录中有多个xlsx文件,现在我们使用glob模块,将它们都读入:

1
xlsx_files = [path for path in Path('XLSX_FILES').rglob('*.xlsx')]
  1. 创建工作簿对象

现在已经读入了所有xlsx文件,接下来还是使用load_workbook方法创建工作簿对象,不过,这次要使用列表解析的方式循环了。

1
wbs = [openpyxl.load_workbook(wb) for wb in xlsx_files]

这个列表中包含了所有xlsx文件的工作簿对象。

  1. 操纵每个文件

所有的工作簿对象都保存到了wbs引用的列表中,比如乣得到第一个工作簿,可以用wbs[0],它的默认工作表名称,可以用wbs[0].sheetnames得到。其他操作跟前面就没有什么差别了。这样我们就能读入多个Excel文件了。

参考链接:https://www.marsja.se/your-guide-to-reading-excel-xlsx-files-in-python/

使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

关注微信公众号,读文章、听课程,提升技能