python excel
Posted 土豆爸
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python excel相关的知识,希望对你有一定的参考价值。
利用Python读取和修改Excel文件(包括xls文件和xlsx文件)——基于xlrd、xlwt和openpyxl模块
本文介绍一下使用Python对Excel文件的基本操作,包括使用xlrd模块读取excel文件,使用xlwt模块将数据写入excel文件,使用openpyxl模块读取写入和修改excel文件。
目录
1、使用xlrd模块对xls文件进行读操作
假设我们的表如下,是一个“农村居民家庭人均纯收入和农村居民家庭人均消费情况”的表格。后缀为.xls。里面包含两个工作表,“各省市”和“测试表”。
提一下,一个Excel文件,就相当于一个“工作簿”(workbook),一个“工作簿”里面可以包含多个“工作表(sheet)”
1.1 获取工作簿对象
引入模块,获得工作簿对象。
-
-
import xlrd #引入模块
-
-
#打开文件,获取excel文件的workbook(工作簿)对象
-
workbook=xlrd.open_workbook("DataSource/Economics.xls") #文件路径
-
-
1.2 获取工作表对象
我们知道一个工作簿里面可以含有多个工作表,当我们获取“工作簿对象”后,可以接着来获取工作表对象,可以通过“索引”的方式获得,也可以通过“表名”的方式获得。
-
‘‘‘对workbook对象进行操作‘‘‘
-
-
#获取所有sheet的名字
-
names=workbook.sheet_names()
-
print(names) #[‘各省市‘, ‘测试表‘] 输出所有的表名,以列表的形式
-
-
#通过sheet索引获得sheet对象
-
worksheet=workbook.sheet_by_index(0)
-
print(worksheet) #<xlrd.sheet.Sheet object at 0x000001B98D99CFD0>
-
-
#通过sheet名获得sheet对象
-
worksheet=workbook.sheet_by_name("各省市")
-
print(worksheet) #<xlrd.sheet.Sheet object at 0x000001B98D99CFD0>
-
-
#由上可知,workbook.sheet_names() 返回一个list对象,可以对这个list对象进行操作
-
sheet0_name=workbook.sheet_names()[0] #通过sheet索引获取sheet名称
-
print(sheet0_name) #各省市
-
1.3 获取工作表的基本信息
在获得“表对象”之后,我们可以获取关于工作表的基本信息。包括表名、行数与列数。
-
‘‘‘对sheet对象进行操作‘‘‘
-
name=worksheet.name #获取表的姓名
-
print(name) #各省市
-
-
nrows=worksheet.nrows #获取该表总行数
-
print(nrows) #32
-
-
ncols=worksheet.ncols #获取该表总列数
-
print(ncols) #13
1.4 按行或列方式获得工作表的数据
有了行数和列数,循环打印出表的全部内容也变得轻而易举。
-
for i in range(nrows): #循环打印每一行
-
print(worksheet.row_values(i)) #以列表形式读出,列表中的每一项是str类型
-
#[‘各省市‘, ‘工资性收入‘, ‘家庭经营纯收入‘, ‘财产性收入‘, ………………]
-
#[‘北京市‘, ‘5047.4‘, ‘1957.1‘, ‘678.8‘, ‘592.2‘, ‘1879.0,…………]
-
-
col_data=worksheet.col_values(0) #获取第一列的内容
-
print(col_data)
-
1.5 获取某一个单元格的数据
我们还可以将查询精确地定位到某一个单元格。
在xlrd模块中,工作表的行和列都是从0开始计数的。
-
#通过坐标读取表格中的数据
-
cell_value1=sheet0.cell_value(0,0)
-
cell_value2=sheet0.cell_value(1,0)
-
print(cell_value1) #各省市
-
print(cell_value2) #北京市
-
-
cell_value1=sheet0.cell(0,0).value
-
print(cell_value1) #各省市
-
cell_value1=sheet0.row(0)[0].value
-
print(cell_value1) #各省市
2、使用xlwt模块对xls文件进行写操作
2.1 创建工作簿
-
-
# 导入xlwt模块
-
import xlwt
-
-
#创建一个Workbook对象,相当于创建了一个Excel文件
-
book=xlwt.Workbook(encoding="utf-8",style_compression=0)
-
-
‘‘‘
-
Workbook类初始化时有encoding和style_compression参数
-
encoding:设置字符编码,一般要这样设置:w = Workbook(encoding=‘utf-8‘),就可以在excel中输出中文了。默认是ascii。
-
style_compression:表示是否压缩,不常用。
-
‘‘‘
2.2 创建工作表
创建完工作簿之后,可以在相应的工作簿中,创建工作表。
-
-
# 创建一个sheet对象,一个sheet对象对应Excel文件中的一张表格。
-
sheet = book.add_sheet(‘test01‘, cell_overwrite_ok=True)
-
# 其中的test是这张表的名字,cell_overwrite_ok,表示是否可以覆盖单元格,其实是Worksheet实例化的一个参数,默认值是False
2.3 按单元格的方式向工作表中添加数据
-
-
# 向表test中添加数据
-
sheet.write(0, 0, ‘各省市‘) # 其中的‘0-行, 0-列‘指定表中的单元,‘各省市‘是向该单元写入的内容
-
sheet.write(0, 1, ‘工资性收入‘)
-
-
#也可以这样添加数据
-
txt1 = ‘北京市‘
-
sheet.write(1,0, txt1)
-
txt2 = 5047.4
-
sheet.write(1, 1, txt2)
最后被文件被保存之后,上文语句形成的“工作表”如下所示:
2.4 按行或列方式向工作表中添加数据
为了验证这个功能,我们在工作簿中,再创建一个工作表,上个工作表叫“test01”,那么这个工作表命名为“test02”,都隶属于同一个工作簿。在下面代码中test02是表名,sheet2才是可供操作的工作表对象。
-
-
#添加第二个表
-
sheet2=book.add_sheet("test02",cell_overwrite_ok=True)
-
-
-
Province=[‘北京市‘, ‘天津市‘, ‘河北省‘, ‘山西省‘, ‘内蒙古自治区‘, ‘辽宁省‘,
-
‘吉林省‘, ‘黑龙江省‘, ‘上海市‘, ‘江苏省‘, ‘浙江省‘, ‘安徽省‘, ‘福建省‘,
-
‘江西省‘, ‘山东省‘, ‘河南省‘, ‘湖北省‘, ‘湖南省‘, ‘广东省‘, ‘广西壮族自治区‘,
-
‘海南省‘, ‘重庆市‘, ‘四川省‘, ‘贵州省‘, ‘云南省‘, ‘西藏自治区‘, ‘陕西省‘, ‘甘肃省‘,
-
‘青海省‘, ‘宁夏回族自治区‘, ‘新疆维吾尔自治区‘]
-
-
Income=[‘5047.4‘, ‘3247.9‘, ‘1514.7‘, ‘1374.3‘, ‘590.7‘, ‘1499.5‘, ‘605.1‘, ‘654.9‘,
-
‘6686.0‘, ‘3104.8‘, ‘3575.1‘, ‘1184.1‘, ‘1855.5‘, ‘1441.3‘, ‘1671.5‘, ‘1022.7‘,
-
‘1199.2‘, ‘1449.6‘, ‘2906.2‘, ‘972.3‘, ‘555.7‘, ‘1309.9‘, ‘1219.5‘, ‘715.5‘, ‘441.8‘,
-
‘568.4‘, ‘848.3‘, ‘637.4‘, ‘653.3‘, ‘823.1‘, ‘254.1‘]
-
-
Project=[‘各省市‘, ‘工资性收入‘, ‘家庭经营纯收入‘, ‘财产性收入‘, ‘转移性收入‘, ‘食品‘, ‘衣着‘,
-
‘居住‘, ‘家庭设备及服务‘, ‘交通和通讯‘, ‘文教、娱乐用品及服务‘, ‘医疗保健‘, ‘其他商品及服务‘]
-
-
#填入第一列
-
for i in range(0, len(Province)):
-
sheet2.write(i+1, 0, Province[i])
-
-
#填入第二列
-
for i in range(0,len(Income)):
-
sheet2.write(i+1,1,Income[i])
-
-
#填入第一行
-
for i in range(0,len(Project)):
-
sheet2.write(0,i,Project[i])
2.5 保存创建的文件
最后保存在特定路径即可。
-
# 最后,将以上操作保存到指定的Excel文件中
-
book.save(‘DataSource\test1.xls‘)
执行出来的工作表test02如下所示:
3、使用openpyxl模块对xlsx文件进行读操作
上面两个模块,xlrd和xlwt都是针对Excel97-2003操作的,也就是以xls结尾的文件。很显然现在基本上都是Excel2007以上的版本,以xlsx为后缀。要对这种类型的Excel文件进行操作要使用openpyxl,该模块既可以进行“读”操作,也可以进行“写”操作,还可以对已经存在的文件做修改。
3.1 获取工作簿对象
-
import openpyxl
-
-
#获取 工作簿对象
-
workbook=openpyxl.load_workbook("DataSourceEconomics.xlsx")
-
#与xlrd 模块的区别
-
#wokrbook=xlrd.open_workbook(""DataSourceEconomics.xls)
3.2 获取所有工作表名
-
#获取工作簿 workbook的所有工作表
-
shenames=workbook.get_sheet_names()
-
print(shenames) #[‘各省市‘, ‘测试表‘]
-
#在xlrd模块中为 sheetnames=workbook.sheet_names()
-
-
#使用上述语句会发出警告:DeprecationWarning: Call to deprecated function get_sheet_names (Use wb.sheetnames).
-
#说明 get_sheet_names已经被弃用 可以改用 wb.sheetnames 方法
-
shenames=workbook.sheetnames
-
print(shenames) #[‘各省市‘, ‘测试表‘]
3.3 获取工作表对象
上一小节获取的工作表名,可以被应用在这一节中,用来获取工作表对象。
-
#获得工作簿的表名后,就可以获得表对象
-
worksheet=workbook.get_sheet_by_name("各省市")
-
print(worksheet) #<Worksheet "各省市">
-
-
#使用上述语句同样弹出警告:DeprecationWarning: Call to deprecated function get_sheet_by_name (Use wb[sheetname]).
-
#改写成如下格式
-
worksheet=workbook["各省市"]
-
print(worksheet) #<Worksheet "各省市">
-
-
#还可以通过如下写法获得表对象
-
worksheet1=workbook[shenames[1]]
-
print(worksheet1) #<Worksheet "测试表">
3.4 根据索引方式获取工作表对象
上一小节获取工作表对象的方式,实际上是通过“表名”来获取,我们可以通过更方便的方式,即通过“索引”方式获取工作表对象。
-
#还可以通过索引方式获取表对象
-
worksheet=workbook.worksheets[0]
-
print(worksheet) #<Worksheet "各省市">
-
-
#也可以用如下方式
-
#获取当前活跃的worksheet,默认就是第一个worksheet
-
ws = workbook.active
3.5 获取工作表的属性
得到工作表对象后,可以获取工作表的相应属性,包括“表名”、“行数”、“列数”
-
#经过上述操作,我们已经获得了第一个“表”的“表对象“,接下来可以对表对象进行操作
-
-
name=worksheet.title #获取表名
-
print(name) #各省市
-
#在xlrd中为worksheet.name
-
-
#获取该表相应的行数和列数
-
rows=worksheet.max_row
-
columns=worksheet.max_column
-
print(rows,columns) #32 13
-
#在xlrd中为 worksheet.nrows worksheet.ncols
3.6 按行或列方式获取表中的数据
要想以行方式或者列方式,获取整个工作表的内容,我们需要使用到以下两个生成器:
sheet.rows,这是一个生成器,里面是每一行数据,每一行数据由一个元组类型包裹。
sheet.columns,同上,里面是每一列数据。
-
for row in worksheet.rows:
-
for cell in row:
-
print(cell.value,end=" ")
-
print()
-
"""
-
各省市 工资性收入 家庭经营纯收入 财产性收入 转移性收入 食品 衣着 居住 家庭设备及服务 ……
-
北京市 5047.4 1957.1 678.8 592.2 1879.0 451.6 859.4 303.5 698.1 844.1 575.8 113.1 ……
-
天津市 3247.9 2707.4 126.4 146.3 1212.6 265.3 664.4 122.4 441.3 315.6 263.2 56.1 ……
-
……
-
"""
-
-
for col in worksheet.columns:
-
for cell in col:
-
print(cell.value,end=" ")
-
print()
-
-
‘‘‘
-
各省市 北京市 天津市 河北省 山西省 内蒙古自治区 辽宁省 吉林省 黑龙江省 上海市 江苏省 浙江省 ……
-
工资性收入 5047.4 3247.9 1514.7 1374.3 590.7 1499.5 605.1 654.9 6686.0 3104.8 3575.1 ……
-
家庭经营纯收入 1957.1 2707.4 2039.6 1622.9 2406.2 2210.8 2556.7 2521.5 767.7 2271.4 ……
-
……
-
‘‘‘
我们可以通过查看sheet.rows 里面的具体格式,来更好的理解代码
-
-
for row in worksheet.rows:
-
print(row)
-
‘‘‘
-
(<Cell ‘各省市‘.A1>, <Cell ‘各省市‘.B1>, <Cell ‘各省市‘.C1>, <Cell ‘各省市‘.D1>, <Cell ‘各省市‘.E1>,……
-
(<Cell ‘各省市‘.A2>, <Cell ‘各省市‘.B2>, <Cell ‘各省市‘.C2>, <Cell ‘各省市‘.D2>, <Cell ‘各省市‘.E2>, ……
-
……
-
‘‘‘
-
#可知,需要二次迭代
-
-
for row in worksheet.rows:
-
for cell in row:
-
print(cell,end=" ")
-
print()
-
-
‘‘‘
-
<Cell ‘各省市‘.A1> <Cell ‘各省市‘.B1> <Cell ‘各省市‘.C1> <Cell ‘各省市‘.D1>……
-
<Cell ‘各省市‘.A2> <Cell ‘各省市‘.B2> <Cell ‘各省市‘.C2> <Cell ‘各省市‘.D2> ……
-
……
-
‘‘‘
-
#还需要cell.value
-
for row in worksheet.rows:
-
for cell in row:
-
print(cell.value,end=" ")
-
print()
3.7 获取特定行或特定列的数据
上述方法可以迭代输出表的所有内容,但是如果要获取特定的行或列的内容呢?我们可以想到的是用“索引”的方式,但是sheet.rows是生成器类型,不能使用索引。所以我们将其转换为list之后再使用索引,例如用list(sheet.rows)[3]来获取第四行的tuple对象。
-
#输出特定的行
-
for cell in list(worksheet.rows)[3]: #获取第四行的数据
-
print(cell.value,end=" ")
-
print()
-
#河北省 1514.7 2039.6 107.7 139.8 915.5 167.9 531.7 115.8 285.7 265.4 166.3 47.0
-
-
#输出特定的列
-
for cell in list(worksheet.columns)[2]: #获取第三列的数据
-
print(cell.value,end=" ")
-
print()
-
#家庭经营纯收入 1957.1 2707.4 2039.6 1622.9 2406.2 2210.8 2556.7 2521.5 767.7 2271.4 3084.3……
-
-
#已经转换成list类型,自然是从0开始计数。
3.8 获取某一块的数据
有时候我们并不需要一整行或一整列内容,那么可以通过如下方式获取其中一小块的内容。
注意两种方式的区别,在第一种方式中,由于生成器被转换成了列表的形式,所以索引是从0开始计数的。
而第二种方式,行和列都是从1开始计数,这是和xlrd模块中最大的不同,在xlrd中行和列都是从0计数的,openpyxl之所这么做是为了和Excel表统一,因为在Excel表,就是从1开始计数。
-
for rows in list(worksheet.rows)[0:3]:
-
for cell in rows[0:3]:
-
print(cell.value,end=" ")
-
print()
-
‘‘‘
-
各省市 工资性收入 家庭经营纯收入
-
北京市 5047.4 1957.1
-
天津市 3247.9 2707.4
-
‘‘‘
-
-
for i in range(1, 4):
-
for j in range(1, 4):
-
print(worksheet.cell(row=i, column=j).value,end=" ")
-
print()
-
‘‘‘
-
各省市 工资性收入 家庭经营纯收入
-
北京市 5047.4 1957.1
-
天津市 3247.9 2707.4
-
-
‘‘‘
3.9 获取某一单元格的数据
有两种方式。
-
#精确读取表格中的某一单元格
-
content_A1= worksheet[‘A1‘].value
-
print(content_A1)
-
-
content_A1=worksheet.cell(row=1,column=1).value
-
#等同于 content_A1=worksheet.cell(1,1).value
-
print(content_A1)
-
#此处的行数和列数都是从1开始计数的,而在xlrd中是由0开始计数的
4、使用openpyxl模块对xlsx文件进行写操作
4.1 创建工作簿和获取工作表
同样的workbook=openpyxl.Workbook() 中“W”要大写。
-
import openpyxl
-
-
# 创建一个Workbook对象,相当于创建了一个Excel文件
-
workbook=openpyxl.Workbook()
-
#wb=openpyxl.Workbook(encoding=‘UTF-8‘)
-
-
#获取当前活跃的worksheet,默认就是第一个worksheet
-
worksheet = workbook.active
-
worksheet.title="mysheet"
4.2 创建新的工作表
-
worksheet2 = workbook.create_sheet() #默认插在工作簿末尾
-
#worksheet2 = workbook.create_sheet(0) #插入在工作簿的第一个位置
-
worksheet2.title = "New Title"
4.3 将数据写入工作表
-
#以下是我们要写入的数据
-
Province=[‘北京市‘, ‘天津市‘, ‘河北省‘, ‘山西省‘, ‘内蒙古自治区‘, ‘辽宁省‘,
-
‘吉林省‘, ‘黑龙江省‘, ‘上海市‘, ‘江苏省‘, ‘浙江省‘, ‘安徽省‘, ‘福建省‘,
-
‘江西省‘, ‘山东省‘, ‘河南省‘, ‘湖北省‘, ‘湖南省‘, ‘广东省‘, ‘广西壮族自治区‘,
-
‘海南省‘, ‘重庆市‘, ‘四川省‘, ‘贵州省‘, ‘云南省‘, ‘西藏自治区‘, ‘陕西省‘, ‘甘肃省‘,
-
‘青海省‘, ‘宁夏回族自治区‘, ‘新疆维吾尔自治区‘]
-
-
Income=[‘5047.4‘, ‘3247.9‘, ‘1514.7‘, ‘1374.3‘, ‘590.7‘, ‘1499.5‘, ‘605.1‘, ‘654.9‘,
-
‘6686.0‘, ‘3104.8‘, ‘3575.1‘, ‘1184.1‘, ‘1855.5‘, ‘1441.3‘, ‘1671.5‘, ‘1022.7‘,
-
‘1199.2‘, ‘1449.6‘, ‘2906.2‘, ‘972.3‘, ‘555.7‘, ‘1309.9‘, ‘1219.5‘, ‘715.5‘, ‘441.8‘,
-
‘568.4‘, ‘848.3‘, ‘637.4‘, ‘653.3‘, ‘823.1‘, ‘254.1‘]
-
-
Project=[‘各省市‘, ‘工资性收入‘, ‘家庭经营纯收入‘, ‘财产性收入‘, ‘转移性收入‘, ‘食品‘, ‘衣着‘,
-
‘居住‘, ‘家庭设备及服务‘, ‘交通和通讯‘, ‘文教、娱乐用品及服务‘, ‘医疗保健‘, ‘其他商品及服务‘]
-
-
#写入第一行数据,行号和列号都从1开始计数
-
for i in range(len(Project)):
-
worksheet.cell(1, i+1,Project[i])
-
-
#写入第一列数据,因为第一行已经有数据了,i+2
-
for i in range(len(Province)):
-
worksheet.cell(i+2,1,Province[i])
-
-
#写入第二列数据
-
for i in range(len(Income)):
-
worksheet.cell(i+2,2,Income[i])
4.4 保存工作簿
workbook.save(filename=‘DataSource\myfile.xlsx‘)
最后运行结果如下所示:
5、修改已经存在的工作簿(表)
5.1 插入一列数据
将第四节中最后保存的myfile.xlsx作为我们要修改的表格,我们计划在最前面插入一列“编号”,如下所示:
-
import openpyxl
-
-
workbook=openpyxl.load_workbook("DataSourcemyfile.xlsx")
-
worksheet=workbook.worksheets[0]
-
-
#在第一列之前插入一列
-
worksheet.insert_cols(1) #
-
-
for index,row in enumerate(worksheet.rows):
-
if index==0:
-
row[0].value="编号" #每一行的一个row[0]就是第一列
-
else:
-
row[0].value=index
-
#枚举出来是tuple类型,从0开始计数
-
-
workbook.save(filename="DataSourcemyfile.xlsx")
运行结果如下:
5.2 修改特定单元格
-
worksheet.cell(2,3,‘0‘)
-
worksheet["B2"]="Peking"
运行结果如下:
5.3 批量修改数据
批量修改数据就相当于写入,会自动覆盖。在上一节中已经有介绍,不再赘述。
还有sheet.append()方法,可以用来添加行。
-
taiwan=[32,"台湾省"]
-
worksheet.append(taiwan)
运行结果如下:
以上是关于python excel的主要内容,如果未能解决你的问题,请参考以下文章