自动化办公day02

第二章 python读取excel数据之xlrd

今天我们来看一下,如何让python读取excel的数据。

1. xlrd介绍与安装

其实我们在工作当中用到excel的机会是非常多的。如果我们用代码操作,就会实现办公自动化。自然我们不需要再取自己写一个框架,而是使用别人的写好的框架,今天介绍的就是xlrd,见名识意xl是excel的尾缀rd是read读的意思。
注意,整个框架无论对xls还是xlsx作为扩展名的excel都是适用的。是读取数据和格式化信息的库。
xlrd的官方文档推荐给大家。

那么下面就是安装了:

pip install xlrd

在这里插入图片描述
建议换源安装,亲测清华源快!可以查看一下:pip freeze
在这里插入图片描述
已经装好了2.0.1版本。

2. xlrd获取工作簿与工作表

2.1 环境搭建

现在我们看看如何来使用吧。首先新建一个项目,新建一个文件夹Lesson2,然后我们打开命令行窗口,cd到文件夹内:


D:\>cd D:\automation\Lesson2

D:\automation\Lesson2>jupyter notebook


打开jupyter编译器,我们看到文件夹是空的。
在这里插入图片描述
我们new一个python文件,重命名为“01_python使用xlrd”
在这里插入图片描述
环境搭建好以后,我们就期待着写代码了。先别急,先要导入xlrd库才行。
在这里插入图片描述
对比较长的库名,我们可以用import…as…来定义一个短名来代替,下面引用的时候方便。
这里我打开一个工作簿
在这里插入图片描述
有两个工作表
在这里插入图片描述
我们说明一下工作逻辑
在这里插入图片描述

2.2 上传工作簿

然后我们上传一个工作簿到平台:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3 获取工作簿

我们看到项目文件夹里就多了一个工作簿。下面我们写代码获取工作簿:
在这里插入图片描述
这里可以使用Tab键来补齐代码非常方便。当我们运行:
在这里插入图片描述

2.4 解决一个bug

报了个错,版本不兼容,我们需要重新安装1.2版本的xlrd。将之前的卸载了:pip uninstall xlrd
然后重新安装:pip install xlrd==1.2.0
在这里插入图片描述
然后我再次操作:
在这里插入图片描述
这次输出了一个对象,说明我们获取到了工作簿。记得,因为重新安装了库,需要将每个代码块都重新执行一遍。

2.5 查看工作簿个数

我们可以查看一下获取到的工作簿有几个工作表:
在这里插入图片描述
nsheets是属性,所以用点而不是括号。

2.6 获取工作表名

我们再获取每个工作表的名字:
在这里插入图片描述

我们看到工作表的名字以列表的形式返回。

2.7 获取工作表

如果我们想具体的获取到每个工作表,怎么办呢?
在这里插入图片描述
返回的是两个工作表对象。

2.7.1 索引获取

假如我想获取“数据集1”中的数据,我首先需要定位到这个工作表。我们可以通过索引来获取:
在这里插入图片描述
注意,我们列表的索引是从0开始的,第二个工作表的索引值是1。

还可以用另外一个命令:
在这里插入图片描述
我们看获取到的是同一个对象。

2.7.2 名字获取

也可以通过工作表名字来获取
在这里插入图片描述
我们看到结果也是相同的。

2.8 验证工作表是否存在

如果我们记不清一个工作簿里面是否有某个工作簿时怎么检验呢?

在这里插入图片描述
返回的是True,说明有这个工作表。也可以传入索引值,甚至可以用运算符:
在这里插入图片描述

3. Python读取行数据

我们如何获取工作表里面的行数据呢?
首先new一个python文件,命名为python读取行数据。同样我们先导入数据,定位工作簿,定位工作表,我们可以先查看一下有多少行:
在这里插入图片描述
我们看到有7626行数据。如果我们想获取某行的数据,直接用命令sheet_two.row(rowx)传入的是行的索引,注意从0开始的。我们可以用加两个问好的方式来查看该命令的使用方法:sheet_two.row??
在这里插入图片描述

比如我们想获取第七行数据,我们直接传入6即可:
在这里插入图片描述

我们看到返回的是一个列表,列表内的元素是“类型:数据”,其中text是字符串的类型。可以用切片的方式获取部分数据,比如:sheet_two.row(6)[6:]就是获取第七行中第七列后的数据:
在这里插入图片描述

其实也可以直接用xlrd封装的方法:
在这里插入图片描述
其中传入的6,6,9是什么意思呢?我们可以查看用法:
在这里插入图片描述
第一个参数是第几行,第二和第三个参数是第几列到第几列。对照切片获取的结果我们可以看到是第七行的第期到九列。如果我们最后一个参数不输入,则结果与切片取得的相同,最后一个参数默认为None。第二个参数默认为0。

我们也可以专门查看一下数据类型:
在这里插入图片描述
参考Excel的数据类型对照表就可以知道数据类型:

ctype
0empty(空值)
1string(字符串)
2number(数字)
3data(日期)
4boolean(布尔)
5error(错误)

对照表格我们看到获取的数据类型全部是字符串。这个查询类型功能也可以切片查询部分数据类型:
在这里插入图片描述
这获取的是第七行的第七列之后的数据类型
如果我们不想要数据中的类型,我们可以直接取值:sheet_two.row_values(6)
在这里插入图片描述
我们看到了,这次取得的数据都是值,没有了类型。
我们也可以用row_len()方便的获取某行有多少个数据:
在这里插入图片描述
返回结果29,说明第七行里有29个有效数据。

4. Python读取列数据

下面我们看看如何读取列数据,方法很类似。
查询工作表中有多少列:sheet_two.ncols

在这里插入图片描述
返回数据显示有29列
比如我们可以获取第七列的数据:sheet_two.col(6)
在这里插入图片描述
我们同样可以查看col的用法:
在这里插入图片描述
我们看到跟获取行数据的参数相似,只是换了名字。也可以切片:
在这里插入图片描述

我们获取了第三列的前10行数据。下面类似的方法我就罗列在下面:

  • sheet_two.col_slice(2,0,10)对第三列切片前10行
  • sheet_two.col_types(2,0,10)对第三列前10行数据类型进行查询
  • sheet_two.col_values(2,0,10)对第三列前10行数据取值
    总之,读取列数据和读取行数据是非常相似的。

5. Python获取单元格数据

如何获取具体到单元格的数据呢?我们重新new一个python File命名为python读取单元格数据。然后我导入模块,定位到工作表:
在这里插入图片描述
我们查看一下获取单元格的数据方法的使用:sheet_two.cell??
在这里插入图片描述
我们看到有两个参数需要传入,一个是行索引值,一个是列索引值,比如我们要取第7行,第7列:
sheet_two.cell(6,6)
在这里插入图片描述
返回的结果就是第7行,第7列的数据。我们也可以只取值而不要类型:sheet_two.cell_value(6,6)或者:sheet_two.cell(6,6).value
在这里插入图片描述
查看单元格类型:sheet_two.cell_type(6,6)或者:sheet_two.cell(6,6).ctype。注意:如果这里直接:sheet_two.cell(6,6).type会报错,必须是ctype

在这里插入图片描述

6. 合并后单元格获取

我们首先上传一个案例工作簿“考场安排”,该工作簿只有一个工作表“Sheet1”注意第一个字母大写,我们定位到这个工作表。
在这里插入图片描述
如果我想获取圈住的内容怎么获取呢?

在这里插入图片描述

方法是:传入的数值,是合并后单元格的开始行索引,开始列索引
sheet1.cell(2,0)
在这里插入图片描述
数据返回的是日期格式的数据,我们也可以只取value:sheet1.cell_value(2,0)或者sheet1.cell(2,0).value
在这里插入图片描述
在这里插入图片描述

也可以获取所有单元格的开始行以及结束行,开始列结束列:sheet1.merged_cells
在这里插入图片描述

获取单元格的类型:sheet1.cell_type()或者sheet1.cell().ctype
在这里插入图片描述

7. 作业

在这里插入图片描述

有这样一个表格,我需要读取里面的信息,将信息以字典的形式清楚的存储到一个列表里。

我们先新new一个python File重命名为“python读取excel表格练习”。我们上传一下这个工作簿。然后我们定位到这个工作簿并获取工作表:

在这里插入图片描述

我们先有一个这样的思路,要想获得每个单元格的数据,我们需要先获得单元格的行列索引值,那么我们先获取有多少行多少列,也即行数和列数:

row_num = table.nrows
col_num = table.ncols

下面我们取出每一行的索引:
在这里插入图片描述
再取出每个列的索引,并将行列以元组输出:
在这里插入图片描述

有了这些行列索引,我们就可以用单元格取值的方法取值了:
在这里插入图片描述
但是我们发现年龄输出的是浮点数,我们可以将其转化为整数,同时将日期转化为:MM/DD/YY的格式,为了方便写逻辑,我们将每个单元格的类型也输出出来:

在这里插入图片描述

这样我们就可以写逻辑来判断处理了,我们将数据类型为2的,如果原来是整数仍然输出整数,如果原来是浮点数,仍然输出浮点数,怎么写呢?

if c_type == 2 and c_value%1 == 0:
	c_value = int(c_value)
	

在这里插入图片描述
我们看到输出为整数了。下面我们处理时间:

if c_type == 2 and c_value%1 == 0:
	c_value = int(c_value)
elif c_type == 3:
	res = xr.xldate_as_tuple(c_value,0) # 第二个参数传入0从1900年计时,传入1从1904年计时。
    	print(res)


在这里插入图片描述
我们看到输出的是元组,我需要格式化一下,用到要给模块datetime,我们先导入一下:
在这里插入图片描述
上图中,我们用到了datetime.datetime()里面传入的参数依次是:年,月,日,时,分,秒
而这些参数通过拆包res元组得到。我们直接把日期复制给c_value
下面我们以键值对的方式来保存数据,key值是我们的表头,我们先获取表头:

在这里插入图片描述
我们再在循环外面定义一个空字典用来接收数据:
在这里插入图片描述
下面我们写逻辑添加到字典中,并输出一下:
在这里插入图片描述
日期格式还需要格式化一下:
在这里插入图片描述
注意观察圈住的部分,如何传参的,注意大小写和空格。
下面我们要在总循环外邦定义一个空列表用来储存数据,并把得到的字典添加进去:
在这里插入图片描述
至此我们看到打印出来的是我们所要求的数据格式:列表里面嵌套字典,表头信息为键,单元格内的数据信息为值。
我们把完整的代码复制到下面,注意看注释:
在这里插入图片描述
本次博客就到这里。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值