Python帮你做Excel——读取excel文档

相信很多坐在办公室上班的朋友每天都需要处理大量的数据,我们常常用Excel制作电子表格来帮助我们处理它们。这当然是一种非常好的做法,但是我相信大家都会发现,很多表格的内容其实大同小异,常常需要我们把同样的数据复制进不同的表格里去,整理格式,然后提交给不同的人。这样没有意义的重复劳动会占用我们大量宝贵的时间。如果有什么人能帮我们把表格做好,我们只需确认一下是否有误然后提交即可,那么生活将会变得多么美好。

Openpyxl就是这样一个得力的工具。

这是一个由Eric Gazoni和Charlie Clark开发的,是目前使用最广泛的用Python操作Excel的库开源库,也是Pandas中默认读取表格数据的工具。

那么这个系列的文章——Python帮你做Excel——就是给大家提供一个简单的Openpyxl的入门中文教程,让大家能快速上手这个好用的小工具。这个基础教程的来源于Python Excel网站,再加入笔者的一些想法。有兴趣的朋友可以访问:

https://www.pythonexcel.com/

首先让我们一起看一下,如何使用Openpyxl读取Excel文档中的数据。

openpyxl基础概念

  • Excel文件通常被称为电子表格,但在openpyxl中被称为工作簿
  • 单个工作簿通常保存在扩展名为.xlsx的文件中
  • 一个工作簿可能只有一个工作表,也可能有几十个工作表
  • 活动工作表是用户正在查看或关闭文件前查看的工作表
  • 每个工作表都由列组成,列的名字从A开始依次类推
  • 每个工作表都由行组成,每个行从1开始编号,依次类推
  • 行与列的交界处称为单元格。每个单元格对于对应的行和列就有了特定的地址。单元格内可以包含数字,公式或者文字
  • 单元格组成的网格在excel中组成了工作区域或者说工作表

从Excel工作表中读取数据

首先我们假设建一个Excel文件,命名为testfile.xlsx

示例表格数据

以上是testfile.xlsx的数据,你可以新建一个excel文件并把数据填进去。
不过在正式使用openpyxl读取这些数据之前,如果你不知道python的根目录在哪,你可以在prompt(中文可以理解为命令提示符,或对话框)中输入如下代码

>>>import os  
>>>os.getcwd( )

上述操作会在python中导入操作系统包,然后os.getcwd( )会读取当下的工作地址(get current working directory ——> getcwd() )。随后python会告诉你当下的工作地址,输出的结果可能会是这样

'C:\\Python36'

如果你想更换工作地址,就需要使用命令os.chdir()。比如你想读取一个在C盘根目录下的一个叫做myfiles的文件夹里的文件,那么你可能就可以输入

>>>os.ch.dir("c:/myfiles")

现在你就可以对C盘里myfiles文件夹里的文件进行工作了!

用Python打开Excel文件

首先我们需要用这个语句在python中导入openpyxl模块

>>> import openpyxl

如果没有错误信息提示,那就表示openpyxl模块安装正确,并且可以对excel文件进行操作了。接下来需要做的是载入工作簿testfile.xlsx

>>>wb= openpyxl.load_workbook('testfile.xlsx')

openpyxl.load_workbook()是一个函数,它将文件名作为参数读入然后返回一个工作簿的数据类型(workbook datatype)。工作簿数据类型实际上与python打开文件对象的类型是一样的,使用下述的语句可以看到对handle的说明:

>>type (wb)  
<class 'openpyxl.workbook.workbook.Workbook'>

上面的第二行文字应该会显示在对话框中,此处我们对前面所有输入的命令进行个简单的汇总展示

>>> import os  
>>> os.getcwd()  
'C:\\Python34'  
>>> import openpyxl  
>>> wb=openpyxl.load_workbook('testfile.xlsx')  
>>> type(wb)  
<class 'openpyxl.workbook.workbook.Workbook'>  
>>>

从加载的工作簿访问工作表

现在我们已经能够访问excel文件了,现在我们可以尝试读取文件里的数据。首先,如果想要访问工作簿中工作表的数量以及它们的名字,可以使用函数get_sheet_names()。这个函数会返回工作表的名字,当然你也可以数出工作表的总数。完整的代码是这样的

>>> wb.get_sheet_names()  
['Sheet1', 'Sheet2', 'Sheet3']

可以看到函数返回了三个工作表的名字,也就是说工作簿内只含有三个工作表。那么现在你可以尝试多操作几次,比如手动修改这些工作表的名字,然后保存文件,随后用上述代码重新加载文件,看看工作表的名字是否有变动,当然此处就不再多加赘述了。
在知道了工作表的名字之后,我们可以访问其中的任何一个工作表了。假设我们想要访问Sheet3,代码就应该是

>>> import openpyxl  
>>> wb=openpyxl.load_workbook('testfile.xlsx')  
>>> wb.get_sheet_names()  
['Sheet1', 'Sheet2', 'Sheet3']  
>>> sheet=wb.get_sheet_by_name('Sheet3')

函数get_sheet_by_name('Sheet3')可以访问一个特定的工作表,它接收工作表的名字作为输入,然后返回一个工作表对象。我们将其赋值给sheet变量,然后就可以对它进行下述操作

>>> sheet  
<Worksheet "Sheet3">  
>>> type(sheet)  
<class 'openpyxl.worksheet.worksheet.Worksheet'>  
>>> sheet.title  
'Sheet3'  
>>>

如果只输入sheet,那么就会输出,该变量指向哪个工作表。在这里例子里,对话框就会返回工作表"Sheet3"。如果想要知道该变量的类型,则输入type(sheet),此时就会返回变量sheet指向什么对象。sheet.title会返回sheet的标题。
另外,如果我们想访问活动的工作表,可以使用下述代码,对话框就会返回活动工作表的名字了

>>> wb.active  
<Worksheet "Sheet1">

访问工作表单元格中的数据

从工作表单元格中访问数据,首先应用工作表,然后输入单元格的地址,具体展示如下

>>> sheet['A2'].value  
datetime.datetime(2014, 7, 6, 4, 50, 30)

还有访问单元格数据的另一个方法

>>> e=sheet['B2']  
>>> e.value  
'AB'  
>>> e.row  
2  
>>> e.column  
'B'  
>>>

还可以使用cell()函数,将row和column作为参数输入,读取单元格数据

>>> sheet.cell(row=2, column=4)  
<Cell Sheet1.D2>  
>>> sheet.cell(row=2, column=4).value  
'Pencil'

现在让我们来尝试输出整列的数据,当然,此处需要使用到循环语句。输出整个列的代码展示如下

>>> for x in range (1,9):  
        print(x,sheet.cell(row=x,column=4).value)

1 Item  
2 Pencil  
3 Binder  
4 Pencil  
5 Pen  
6 Pencil  
7 Binder  
8 Pencil  
>>>

在输出了整列数据后,现在可以尝试输出多列的数据了。由于我们的文件很小,所以我们就输出完整的表格。详见下方代码

for y in range (1,9,1):  
print(sheet.cell(row=y,column=1).value,sheet.cell(row=y,column=2).value,  
sheet.cell(row=y,column=3).value,sheet.cell(row=y,column=4).value,  
sheet.cell(row=y,column=5).value, sheet.cell(row=y,column=6).value,  
sheet.cell(row=y,column=7).value,sheet.cell(row=y,column=8).value)

这些代码可以输出工作表中的所有列,那么至此,我们已经访问了excel文件,将其载入内存,访问工作表以及单元格里的数据。下一章节,我们将详细讲述如何用python将数据写入excel文件。

敬请期待啦!

©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 207,113评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,644评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,340评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,449评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,445评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,166评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,442评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,105评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,601评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,066评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,161评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,792评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,351评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,352评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,584评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,618评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,916评论 2 344

推荐阅读更多精彩内容