相关说明:
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提供的接口比较多,常用的方法如下:
方法 | 说明 |
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文件
我们知道一个工作簿里面可以含有多个工作表,当我们获取“工作簿对象”后,可以接着来获取工作表对象,可以通过“索引”的方式获得,也可以通过“表名”的方式获得。
例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