用xlrd模块读取.xls文件

2019年8月3日 / 30次阅读 / Last Modified 2019年8月4日

Python标准库中,没有可以直接读写excel文件的模块接口。xlrd是一个第三方的库,而且它只能用来读.xls,即低版本的excel文件。(xlwt对应xlrd,用来写.xls文件,对于.xlsx文件,可以考虑使用openpyxl模块)

本文介绍xlrd模块的使用,即如何读.xls文件中的数据。现在是大数据时代,其实还有很多地方能够见到非常大的.xls文件,需要程序来自动化处理。

安装xlrd模块

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文件,有几个概念要先搞清楚:

  • workbook,就是指一个excel文件;
  • sheet,指excel文件中的一页;
  • cell,指一个单元格;

测试用.xls文件

如下这个excel表格,是后面代码的操作的文件,文件名:xlrd_test.xls

测试用.xls文件
测试用.xls文件

故意将第4行(excel软件视角的行数)全部为空,故意设计D5有一个公式。

打开workbook,选择sheet

>>> 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对应。

读取sheet中的内容

>>> 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。

xldate类型cell值的处理

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

有了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文件》有1条留言

    电子邮件地址不会被公开。 必填项已用*标注

    • 麦新杰

      xlrd在读取xls文件时的cell type: 0 empty,1 string,2 number, 3 date,4 boolean,5 error [回复]


    前一篇:
    后一篇:

    More

    麦新杰的Python笔记

    Ctrl+D 收藏本页


    ©Copyright 麦新杰 Since 2019 Python笔记

    go to top