前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用Python读取Excel文件指南

用Python读取Excel文件指南

作者头像
老齐
发布2020-06-16 16:32:33
2.4K0
发布2020-06-16 16:32:33
举报
文章被收录于专栏:老齐教室

原作者:Erik Marsja

编译者:老齐

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

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

Openpyxl简介

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

代码语言:javascript
复制
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两个模块。

代码语言:javascript
复制
import openpyxl
from pathlib import Path
  1. 设置Excel文件路径

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

代码语言:javascript
复制
# 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()方法读取文件:

代码语言:javascript
复制
wb_obj = openpyxl.load_workbook(xlsx_file)

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

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

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

代码语言:javascript
复制
wsheet = wb_obj.active

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

  1. 操作工作表

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

代码语言:javascript
复制
print(sheet["C2"].value)

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

代码语言:javascript
复制
for row in sheet.iter_rows(max_row=6):
    for cell in row:
        print(cell.value, end=" ")
    print()

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

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

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

代码语言:javascript
复制
print(sheet.max_row, sheet.max_column)

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

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

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

代码语言:javascript
复制
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内容保存为字典对象,当然要创建一个字典,然后就是通过循环的方式,向字典中增加相应内容。

代码语言:javascript
复制
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

代码语言:javascript
复制
import glob
import openpyxl
from pathlib import Path
  1. 读取目录中的所有xlsx文件

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

代码语言:javascript
复制
xlsx_files = [path for path in Path('XLSX_FILES').rglob('*.xlsx')]
  1. 创建工作簿对象

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

代码语言:javascript
复制
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/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 老齐教室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Openpyxl简介
  • 读取单个文件
  • 将读入的Excel文件保存为Python字典
  • 读取多个Excel文件
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档