2019年8月3日 / 1,630次阅读 / Last Modified 2020年7月8日
excel表格
Python标准库中,没有可以直接读写excel文件的模块接口。xlrd是一个第三方的库,而且它只能用来读.xls,即低版本的excel文件。(xlwt对应xlrd,用来写.xls文件,对于.xlsx文件,可以考虑使用openpyxl模块)
本文介绍xlrd模块的使用,即如何读.xls文件中的数据。现在是大数据时代,其实还有很多地方能够见到非常大的.xls文件,需要程序来自动化处理。
xlrd是一个第三方模块,可以通过pip安装。
$ sudo pip3 install xlrd
Collecting xlrd
Downloading https://files.pythonhosted.org/packages/b0/16/63576a1a001752e34bf8ea62e367997530dc553b689356b9879339cf45a4/xlrd-1.2.0-py2.py3-none-any.whl (103kB)
100% |████████████████████████████████| 112kB 74kB/s
Installing collected packages: xlrd
Successfully installed xlrd-1.2.0
写此文的时候,xlrd的版本号是1.2.0。从安装过程可以看出,xlrd比较单纯,没有什么别的依赖库。安装好了之后,可以用 pip3 list 命令check一下:
$ pip3 list
Package Version
---------- -------
et-xmlfile 1.0.1
jdcal 1.4.1
openpyxl 2.6.2
pip 19.0.3
setuptools 40.8.0
xlrd 1.2.0
在Python解释器中,用执行 import xlrd,如果没有报错,也可以起到check的作用。
操作excel文件,有几个概念要先搞清楚:
如下这个excel表格,是后面代码的操作的文件,文件名:xlrd_test.xls
故意将第4行(excel软件视角的行数)全部为空,故意设计D5有一个公式。
>>> import xlrd
>>> book = xlrd.open_workbook('xlrd_test.xls')
>>> book.sheet_names()
['xlrd_test', '123', 'abc']
>>> book.sheet_by_name('xlrd_test')
<xlrd.sheet.Sheet object at 0x0000000002C2E400>
>>> book.sheet_loaded('xlrd_test')
True
>>> book.unload_sheet('xlrd_test')
>>> book.sheet_loaded('xlrd_test')
False
引入xlrd模块;打开一个workbook;用 sheet_names() 函数看一下这个excel文件中,都有哪些sheet,这个函数返回一个list对象。我们要读取某个sheet中的数据,首先要使用 sheet_by_name() 函数,将那个sheet的选中,这时如果使用 sheet_loaded() 函数,就会返回True,还有一个 unload_sheet() 函数,进行相反的操作。
>>> book = xlrd.open_workbook('xlrd_test.xls')
>>> book.sheet_names()
['xlrd_test', '123', 'abc']
>>> book.sheet_by_index(0)
<xlrd.sheet.Sheet object at 0x0000000002C47C50>
>>> book.sheet_loaded(0)
True
>>> book.sheet_loaded('xlrd_test')
True
这次换了 sheet_by_index() 函数,0就是对应xlrd_test这个sheet,1对应sheet 123,2对应sheet abc,与 sheet_names() 函数返回的list的index对应。
>>> sh = book.sheet_by_index(0)
>>> sh.name
'xlrd_test'
>>> sh.nrows
5
>>> sh.ncols
5
>>> sh.row_values(4)
[55.0, 'e', 43658.0, 6.0, '&']
>>> sh.col_values(3)
[1.0, 2.0, 3.0, '', 6.0]
>>> sh.cell_value(0,0)
1.0
>>> sh.cell_value(1,1)
''
>>> sh.cell_value(2,2)
43656.0
>>> sh.cell_value(3,4)
''
>>> sh.cell_value(4,3)
6.0
选中sheet of index 0;查看它的名称,行数,列数,有了行数和列数,就可以遍历了。row_value() 函数读取某一行的全部数据,col_vaule() 函数读取某一列的全部数据,注意:行和列的index都是从0开始! 然后就是用 cell_value() 函数读取某一个cell的值,这个函数的两个参数,就是从0开始的行号和列号。
第4行第3列的cell的值是6,这个值是一个公式计算出来的,xlrd依然直接获取!
>>> sh.cell(1,0)
number:2.0
>>> sh.cell(1,2)
xldate:43655.0
>>> sh.cell(1,1)
empty:''
>>> sh.cell(1,4)
text:'#'
>>> sh.cell(1,2)
xldate:43655.0
>>> sh.cell(1,2).value
43655.0
指定调用 cell() 函数,还能看到每个cell的类型。主要有number,xldate,empty,text这几种。注意xldate类型,这个类型要转换一下才能看到直观的日期信息,这个后面介绍。先看一下判断cell type的方法:
>>> sh.row(1)
[number:2.0, empty:'', xldate:43655.0, number:2.0, text:'#']
>>> sh.row(1)[0]
number:2.0
>>> sh.cell_type(1,0)
2
>>> sh.cell_type(1,1)
0
>>> sh.cell_type(1,2)
3
>>> sh.cell_type(1,4)
1
0对应empty,1对应text,2对应number,3对应xldate。
xlrd模块中,有两个函数可以将xldate类型的cell值进行转换:
>>> xlrd.xldate_as_tuple(sh.cell(1,2).value,0)
(2019, 7, 9, 0, 0, 0)
>>> xlrd.xldate_as_datetime(sh.cell(1,2).value,0)
datetime.datetime(2019, 7, 9, 0, 0)
到这里,你可以需要参考一下datetime.datetime模块的一些用法。
有了sheet的行数和列数,就可以遍历了。我这里给出一段简单的代码,供大家参考:
>>> for i in range(sh.nrows):
... for j in range(sh.ncols):
... if sh.cell_type(i,j) == 3: # xldate
... print(xlrd.xldate_as_tuple(sh.cell_value(i,j),0))
... else:
... print(sh.cell_value(i,j))
...
1.0
aaa
(2019, 7, 8, 0, 0, 0)
1.0
@
2.0
(2019, 7, 9, 0, 0, 0)
2.0
#
333.0
cccc
(2019, 7, 10, 0, 0, 0)
3.0
$
55.0
e
(2019, 7, 12, 0, 0, 0)
6.0
&
上面代码执行后,空出来的那些行,就是empty cell造成的。
还可以使用 get_rows() 这个生成器(generator)来遍历 sheet,请看下面的代码:
>>> for row in sh.get_rows():
... for j in range(len(row)):
... print(row[j].value)
...
1.0
aaa
43654.0
1.0
@
2.0
43655.0
2.0
#
333.0
cccc
43656.0
3.0
$
55.0
e
43658.0
6.0
&
以上就是对xlrd模块读取.xls文件数据的介绍。
-- EOF --
本文链接:https://www.pynote.net/archives/724
《用xlrd模块读取.xls文件》有3条留言
©Copyright 麦新杰 Since 2019 Python笔记
xlrd is primarily for the older BIFF file format of .XLS files but it does have limited support for XLSX. [ ]
现在主要是xlsx文件,用pandas模块来处理。 [ ]
xlrd在读取xls文件时的cell type: 0 empty,1 string,2 number, 3 date,4 boolean,5 error [ ]