python:读取Excel文件

python处理Excel

相关说明:
1、Python自带的csv模块可以处理.csv文件。

2、xlrd和xlwt两个模块分别用来读Excel和写Excel,只支持.xls和.xlsx格式,xlutils模块可以同时读写一个已存在的Excel文件,依赖于xlrd和xlwt。

3、openpyxl(可读写excel表)专门处理Excel2007及以上版本产生的xlsx文件;2007一下的版本为xls结尾的文件,需要使用xlrd(读)和xlwt(写)库进行操作

4、excel表的文字编码如果是“gb2312” 读取后就会显示乱码,请先转成Unicode

5、workbook: 工作簿,一个excel文件包含多个sheet。

6、sheet:工作表,一个workbook有多个,表名识别,如“sheet1”,“sheet2”等。

7、cell: 单元格,存储数据对象

8、常用单元格中的数据类型empty(空的),string(text),number, date, boolean, error,blank(空白表格)


使用xlrd读Excel

xlrd提供的接口比较多,常用的方法如下:

方法       说明
open_workbook()

 打开指定的Excel文件,返回一个Book对象:通过Book对象可以得到各个Sheet对象(一个Excel文件可以有多个Sheet,每个Sheet就是一张表格)

Book.nsheets     返回Sheet的数目
Book.sheets() 返回所有Sheet对象的list
Book.sheet_by_index(index)   返回指定索引处的Sheet。相当于Book.sheets()[index]
Book.sheet_names()  返回所有Sheet对象名字的list(为一个str类型的列表)
Book.sheet_by_name(name) 根据指定Sheet对象名字返回She

通过Sheet对象可以获取各个单元格,每个单元格是一个Cell对象

方法 说明
Sheet.name   返回表格的名称
Sheet.nrows  返回表格的行数
Sheet.ncols     返回表格的列数
Sheet.row(r)  获取指定行,返回Cell对象的list
Sheet.col(c)  获取指定列,返回Cell对象的list
Sheet.row_values(r)   获取指定行的值,返回list
Sheet.col_values(c)  获取指定列的值,返回list
Sheet.cell(r, c)   根据位置获取Cell对象
Sheet.cell_value(r, c)  根据位置获取Cell对象的值
Cell.value 返回单元格的值

注:
总的来说在处理Excel时的步骤是:先获取需要处理的Excel文件对象(Book对象,open_workbook()),再获得工作簿中的sheet对象(Book.sheet_by_index(index)等方法),在sheet对象中进行处理

 

此次的测试Excel文件

python:读取Excel文件_第1张图片

 


获取工作表对象

我们知道一个工作簿里面可以含有多个工作表,当我们获取“工作簿对象”后,可以接着来获取工作表对象,可以通过“索引”的方式获得,也可以通过“表名”的方式获得。

例1:
通过Book.sheets( )方法获得sheet对象

import xlrd

excel_path = "F:\\Excel_demo\\demo.xls"

#打开文件,获取excel文件的workbook(工作簿)对象
excel = xlrd.open_workbook(excel_path,encoding_override="utf-8")


#返回所有Sheet对象的list
all_sheet = excel.sheets()#Book(工作簿)对象方法
print(all_sheet)

#遍历返回的Sheet对象的list
for each_sheet in all_sheet:
    print(each_sheet)
    print("sheet名称为:",each_sheet.name)#sheet对象方法

"""
[, , ]

sheet名称为: Sheet1

sheet名称为: Sheet2

sheet名称为: Sheet3
"""

例1_1:
通过Book.sheet_by_index(index)方法获得sheet对象

import xlrd

excel_path = "F:\\Excel_demo\\demo.xls"

#打开文件,获取excel文件的workbook(工作簿)对象
excel = xlrd.open_workbook(excel_path,encoding_override="utf-8")


#返回所有Sheet对象的list
all_sheet = excel.sheets()
print(all_sheet)

for i in range(len(all_sheet)):
    each_sheet_by_index = excel.sheet_by_index(i)#通过sheet索引获得sheet对象
    print("表名称为:{0},类型为:{1}".format(each_sheet_by_index, type(each_sheet_by_index)))
    print("sheet名称为:", each_sheet_by_index.name)  # sheet对象方法


"""
[, , ]
表名称为:,类型为:
sheet名称为: Sheet1
表名称为:,类型为:
sheet名称为: Sheet2
表名称为:,类型为:
sheet名称为: Sheet3
"""

注:从上面的代码可以看出,这种用法(excel.sheet_by_index(i))其实就是Book.sheets()[index]相同,只是说例1中的用法比较简便

例1_2:
Book.sheet_names() 这种获得的不是sheet对象,只是一个str类型的列表(sheet对象名字的列表)

import xlrd

excel_path = "F:\\Excel_demo\\demo.xls"

#打开文件,获取excel文件的workbook(工作簿)对象
excel = xlrd.open_workbook(excel_path,encoding_override="utf-8")


#返回所有Sheet对象名字的list
all_sheet = excel.sheet_names()
print(all_sheet)

#遍历返回的Sheet对象名字的list
for each_sheet_by_name in all_sheet:
    print("表名称为:{0},类型为:{1}".format(each_sheet_by_name ,type(each_sheet_by_name )))
    #print(each_sheet_by_name.ncols)
    
"""
['Sheet1', 'Sheet2', 'Sheet3']
表名称为:Sheet1,类型为:
表名称为:Sheet2,类型为:
表名称为:Sheet3,类型为:
"""

注:
从上面例子中可以看出遍历出来的只是一个字符串类型的对象('Sheet1', 'Sheet2', 'Sheet3'),而不是sheet对象,因此不能使用seet对象方法(Sheet.name等)

例1_2:
通过表名称索引来获得Book.sheet_by_name(name)

import xlrd

excel_path = "F:\\Excel_demo\\demo.xls"

#打开文件,获取excel文件的workbook(工作簿)对象
excel = xlrd.open_workbook(excel_path,encoding_override="utf-8")


#返回所有Sheet对象名字的list
all_sheet = excel.sheet_names()
#workbook.sheet_names() 返回一个list对象,可以对这个list对象进行操作
print(all_sheet)

for i in all_sheet:
    each_sheet_by_name = excel.sheet_by_name(i)#通过sheet索引获得sheet对象
    print("表名称为:{0},类型为:{1}".format(each_sheet_by_name, type(each_sheet_by_name)))
    print("sheet名称为:", each_sheet_by_name.name)  # sheet对象方法

"""
['Sheet1', 'Sheet2', 'Sheet3']
表名称为:,类型为:
sheet名称为: Sheet1
表名称为:,类型为:
sheet名称为: Sheet2
表名称为:,类型为:
sheet名称为: Sheet3
"""

例1_4:
除了以上方法,还有一种获得sheet对象的方法

import xlrd

excel_path = "F:\\Excel_demo\\demo.xls"

#打开文件,获取excel文件的workbook(工作簿)对象
excel = xlrd.open_workbook(excel_path,encoding_override="utf-8")

#返回Sheet的数目
all_sheet_count = excel.nsheets
print(all_sheet_count)

for i in range(all_sheet_count):
    sheet = excel.sheet_by_index(i)#通过索引sheet数目来获得,与第二种方法类似
    print("表名称为:{0},类型为:{1}".format(sheet , type(sheet )))

"""
3
表名称为:,类型为:
表名称为:,类型为:
表名称为:,类型为:
"""

 

获取工作表的基本信息

在获得“表对象”之后,我们可以获取关于工作表的基本信息。包括表名、行数与列数等
例2:获取sheet对象的名称、行数、列数

import xlrd

excel_path = "F:\\Excel_demo\\demo.xls"

#打开文件,获取excel文件的workbook(工作簿)对象
excel = xlrd.open_workbook(excel_path,encoding_override="utf-8")

#获取sheet对象
all_sheet = excel.sheets()

#循环遍历每个sheet对象
sheet_name = []
sheet_row = []
sheet_col = []
for sheet in all_sheet:
    sheet_name.append(sheet.name)
    print("该Excel共有{0}个sheet,当前sheet名称为{1},该sheet共有{2}行,{3}列"
          .format(len(all_sheet),sheet.name,sheet.nrows,sheet.ncols))
    sheet_row.append(sheet.nrows)
    sheet_col.append(sheet.ncols)

print(sheet_name)#获取sheet的名称
print(sheet_row )#获取sheet对象的行数
print(sheet_col)#获取sheet对象的列数

"""
该Excel共有3个sheet,当前sheet名称为Sheet1,该sheet共有13行,9列
该Excel共有3个sheet,当前sheet名称为Sheet2,该sheet共有9行,10列
该Excel共有3个sheet,当前sheet名称为Sheet3,该sheet共有18行,8列
['Sheet1', 'Sheet2', 'Sheet3']
[13, 9, 18]
[9, 10, 8]
"""


例3:按行或列方式获得工作表的数据

import xlrd

excel_path = "F:\\Excel_demo\\demo.xls"

#打开文件,获取excel文件的workbook(工作簿)对象
excel = xlrd.open_workbook(excel_path,encoding_override="utf-8")

#获取sheet对象
all_sheet = excel.sheets()

#循环遍历每个sheet对象
sheet_name = []
sheet_row = []
sheet_col = []
for sheet in all_sheet:
    sheet_name.append(sheet.name)
    print("该Excel共有{0}个sheet,当前sheet名称为{1},该sheet共有{2}行,{3}列"
          .format(len(all_sheet),sheet.name,sheet.nrows,sheet.ncols))
    for each_row in range(sheet.nrows):#循环打印每一行
        print("当前为%s行:"% each_row,type(each_row))
        print(sheet.row_values(each_row),type(sheet.row_values(each_row)))

first_row_value = sheet.row_values(0)#打印指定的某一行
print("第一行的数据为:%s" % first_row_value)

"""
该Excel共有3个sheet,当前sheet名称为小于一比八的职位,该sheet共有4行,6列
当前为0行: 
['地区', '单位名称', '职位代码', '职位名称', '招录人数', '报考人数'] 
当前为1行: 
['省级单位', '浙江警官职业学院', '13312004000000001', '司法警务专业教学', 1.0, '0'] 
当前为2行: 
['省级单位', '浙江警官职业学院', '13312004000000002', '法学教学', 1.0, '1'] 
当前为3行: 
.......
第一行的数据为:['地区', '单位名称', '职位代码', '职位名称', '招录人数', '报考人数']
"""

注:
1、从上面例子中可以看出,在获得sheet对象的行数后,可以使用循环遍历的方法(for each_row in range(sheet.nrows),再通过sheet.row_values(each_row)方法获得出每一行的数据

2、可以通过索引的方法可以获得指定的某一行的数据的(sheet.row_values(0)):其实这种跟上面1中的实际上是一致的

3、通过输出的结果可以看出:获得的每一行的数据类型为一个列表,每一个单元格的数据为列表中的一个元素,一行中的所有数据组成一个列表
 

例3_1:

import xlrd

excel_path = "F:\\Excel_demo\\demo.xls"

#打开文件,获取excel文件的workbook(工作簿)对象
excel = xlrd.open_workbook(excel_path,encoding_override="utf-8")

#获取sheet对象
all_sheet = excel.sheets()

#循环遍历每个sheet对象
sheet_name = []
sheet_row = []
sheet_col = []
for sheet in all_sheet:
    sheet_name.append(sheet.name)
    print("该Excel共有{0}个sheet,当前sheet名称为{1},该sheet共有{2}行,{3}列"
          .format(len(all_sheet),sheet.name,sheet.nrows,sheet.ncols))

    print(sheet.col_values(0))#获取指定列的数据

    for each_col in range(sheet.ncols):#依次获得每一列的数据
        print("当前为%s列:"% each_col )

        print(sheet.col_values(each_col ),type(sheet.col_values(each_col )))

"""
该Excel共有3个sheet,当前sheet名称为小于一比八的职位,该sheet共有4行,6列
['地区', '省级单位', '省级单位', '省级单位']
当前为0列:
['地区', '省级单位', '省级单位', '省级单位'] 
当前为1列:
['单位名称', '浙江警官职业学院', '浙江警官职业学院', '浙江警官职业学院'] 
当前为2列:
['职位代码', '13312004000000001', '13312004000000002', '13312004000000003'] 
当前为3列:
['职位名称', '司法警务专业教学', '法学教学', '民航空中安保教学'] 
当前为4列:
.....
"""

注:
1、从上面的例子可以看出:可以通过遍历全部列数(for each_col in range(sheet.ncols))的方法获得全部列的数据,也可以通过索引获得指定列的数据

2、返回的数据依旧是列表:一列中每个单元格的数据为列表中的一个元素

 

获取行或列对象

通过sheet对象中的Sheet.row(r)或Sheet.col(c)可以获得指定行或列,返回Cell对象的list
例4:

import xlrd

excel_path = "F:\\Excel_demo\\demo.xls"

#打开文件,获取excel文件的workbook(工作簿)对象
excel = xlrd.open_workbook(excel_path,encoding_override="utf-8")

#获取sheet对象
all_sheet = excel.sheets()

#循环遍历每个sheet对象
for sheet in all_sheet:
    print("该Excel共有{0}个sheet,当前sheet名称为{1},该sheet共有{2}行,{3}列"
          .format(len(all_sheet),sheet.name,sheet.nrows,sheet.ncols))
    sheet_cell_first_row = sheet.row(0)#获取指定行对象
    print(sheet_cell_first_row)
    for i in range(sheet.nrows):#依次遍历获得每一行对象
        each_cell_value_row = sheet.row(i)
        print(each_cell_value_row,type(each_cell_value_row))

"""
该Excel共有3个sheet,当前sheet名称为小于一比八的职位,该sheet共有4行,6列
[text:'地区', text:'单位名称', text:'职位代码', text:'职位名称', text:'招录人数', text:'报考人数']
[text:'地区', text:'单位名称', text:'职位代码', text:'职位名称', text:'招录人数', text:'报考人数'] 
[text:'省级单位', text:'浙江警官职业学院', text:'13312004000000001', text:'司法警务专业教学', number:1.0, text:'0'] 
[text:'省级单位', text:'浙江警官职业学院', text:'13312004000000002', text:'法学教学', number:1.0, text:'1'] 
[text:'省级单位', text:'浙江警官职业学院', text:'13312004000000003', text:'民航空中安保教学', number:1.0, text:'1'] 
该Excel共有3个sheet,当前sheet名称为大于一比八十的职位,该sheet共有11行,6列
"""

注:
从上面的输出结果可以看出:返回的结果的类型为一个嵌套了字典的列表,字典的键为默认值(test),字典的值为每个单元格的值(数据)

例4_1:

import xlrd

excel_path = "F:\\Excel_demo\\demo.xls"

#打开文件,获取excel文件的workbook(工作簿)对象
excel = xlrd.open_workbook(excel_path,encoding_override="utf-8")

#获取sheet对象
all_sheet = excel.sheets()

#循环遍历每个sheet对象
for sheet in all_sheet:
    print("该Excel共有{0}个sheet,当前sheet名称为{1},该sheet共有{2}行,{3}列"
          .format(len(all_sheet),sheet.name,sheet.nrows,sheet.ncols))
    sheet_cell_first_col = sheet.col(0)#获取指定列对象
    print(sheet_cell_first_col)
    for i in range(sheet.ncols):#依次遍历获得每一列对象
        each_cell_value_col = sheet.col(i)
        print(each_cell_value_col,type(each_cell_value_col))

"""
该Excel共有3个sheet,当前sheet名称为小于一比八的职位,该sheet共有4行,6列
[text:'地区', text:'省级单位', text:'省级单位', text:'省级单位']
[text:'地区', text:'省级单位', text:'省级单位', text:'省级单位'] 
[text:'单位名称', text:'浙江警官职业学院', text:'浙江警官职业学院', text:'浙江警官职业学院'] 
[text:'职位代码', text:'13312004000000001', text:'13312004000000002', text:'13312004000000003'] 
[text:'职位名称', text:'司法警务专业教学', text:'法学教学', text:'民航空中安保教学'] 
[text:'招录人数', number:1.0, number:1.0, number:1.0] 
[text:'报考人数', text:'0', text:'1', text:'1'] 
该Excel共有3个sheet,当前sheet名称为大于一比八十的职位,该sheet共有11行,6列
"""

 

获取某一个单元格的数据

1、我们还可以将查询精确地定位到某一个单元格。在xlrd模块中,工作表的行和列都是从0开始计数的

2、单元格:单元格是表格中行与列的交叉部分,它是组成表格的最小单位,可拆分或者合并。单个数据的输入和修改都是在单元格中进行的
例5:

import xlrd

excel_path = "F:\\Excel_demo\\demo.xls"

#打开文件,获取excel文件的workbook(工作簿)对象
excel = xlrd.open_workbook(excel_path,encoding_override="utf-8")

#获取sheet对象
all_sheet = excel.sheets()

#循环遍历每个sheet对象
for sheet in all_sheet:
    print("该Excel共有{0}个sheet,当前sheet名称为{1},该sheet共有{2}行,{3}列"
      .format(len(all_sheet),sheet.name,sheet.nrows,sheet.ncols))
    sheet_cell = sheet.cell(0,0)#根据位置获取Cell对象
    print(sheet_cell)
    sheet_cell_value = sheet_cell.value#返回单元格的值
    print(sheet_cell_value)

    sheet_cell_value_1 = sheet.cell_value(0,0)#根据位置获取Cell对象的值
    print(sheet_cell_value_1)
"""
该Excel共有3个sheet,当前sheet名称为小于一比八的职位,该sheet共有4行,6列
text:'地区'
地区
地区
该Excel共有3个sheet,当前sheet名称为大于一比八十的职位,该sheet共有11行,6列
text:'地区'
地区
地区
该Excel共有3个sheet,当前sheet名称为Sheet1,该sheet共有22行,6列
text:'地区'
地区
地区
"""

 

拓展:

获取每一个单元格的值(数据)
例6:

import xlrd

excel_path = "F:\\Excel_demo\\demo.xls"

#打开文件,获取excel文件的workbook(工作簿)对象
excel = xlrd.open_workbook(excel_path,encoding_override="utf-8")

#获取sheet对象
sheet = excel.sheets()[0]

sheet_row_mount = sheet.nrows#4行
sheet_col_mount = sheet.ncols#6列

print(sheet_row_mount,sheet_col_mount)

for x in range(sheet_row_mount):#4
    y = 0
    while y < sheet_col_mount:#6
        print(sheet.cell_value(x,y))
        y += 1

"""
4 6
地区
单位名称
职位代码
职位名称
招录人数
报考人数
省级单位
浙江警官职业学院
13312004000000001
司法警务专业教学
1.0
0
省级单位
......
"""

注:
Excel文件中行和列的索引是从0开始的(且文件返回的是一个列表),所以如果上面例子中判断条件为while y <= sheet_col_mount时就会报错 :IndexError: list index out of range


 

你可能感兴趣的:(python3)