上一篇文章我们实现了通过xlrd,xlwt和xlutils对Excel的读取和写入,并进行修改。但是xlrd等模块还存在一定的问题:仅仅支持对旧格式的.xls文件进行读写,而且无法修改原始Excel等等。因此我们这次使用openpyxl和pandas库来对Excel进行操作。
下面我们首先来看一下如何用openpyxl包来读写Excel,首先我们需要导入openpyxl包(如果没有安装的话,可以使用pip install openpyxl来安装)
总体上的读取方法与xlrd类似,不过API更加简单明了。读取Excel之前,我们需要先调用load_workbook方法来加载Excel。通过get_sheet_by_name()方法获取相应的sheet,或者通过get_active_sheet()方法获取当前活动的sheet。这里有一个要注意的地方,就是openpyxl的行列都是从1开始的,不像通常从0开始,因此在读取单元格的时候要+1,其余的部分就和xlrd类似了,代码如下:
import openpyxl
## 读取Excel表格内容
def read_excel(fileName='D:/Book1.xlsx'):
wb = openpyxl.load_workbook(fileName)
sheet = wb.get_sheet_by_name('Sheet1')
nrows = sheet.max_row
ncols = sheet.max_column
## 注意:openpyxl的行列数是从1开始计算的,因此通过sheet.cell()获取表单的值的时候需要从1开始
for i in range(nrows):
for j in range(ncols):
print(sheet.cell(i+1,j+1).value, end=' ')
print()
read_excel()
读取结果
计算平均分的方法与前文类似
## 计算个人平均分
def get_average(fileName='D://Book1.xlsx'):
avg_dict = {}
wb = openpyxl.load_workbook(fileName)
sheet = wb.get_sheet_by_name('Sheet1')
nrows = sheet.max_row
ncols = sheet.max_column
for row in range(1,nrows):
avg = 0.0
for col in range(1,ncols):
avg += float(sheet.cell(row+1, col+1).value) ## 计算每一个学生的总分
avg /= (ncols-1) ## 总分除以课程数即是平均分
avg_dict[sheet.cell(row+1, 1).value] = avg ## 每行的第一列是学生姓名,用作字典的键,平均分作为值
print(avg_dict)
return avg_dict
avg_dict = get_average()
这里,我们先将平均分写入到一个新建的Excel工作表中,实现与上一篇文章类似的功能。新建Excel需要先通过openpyxl.Workbook()方法来获取一个新的Excel文档,通过active属性得到可访问的工作表sheet。接下来只要在表格中填入数据即可,需要注意的是序列号是从1开始的。
## 将字典写入到Excel中
def write_excel(value_dict, resultName='D://Book2.xlsx'):
wb = openpyxl.Workbook()
sheet = wb.active
#sheet = wb.create_sheet()
## 先在标题栏加入“姓名”和“平均分”列
sheet.cell(1,1).value = '姓名'
sheet.cell(1,2).value = '平均分'
## 遍历字典,写入姓名和平均分
row = 2
for key in value_dict.keys():
sheet.cell(row,1).value = key
sheet.cell(row,2).value = value_dict[key]
row+=1
wb.save(resultName)
write_excel(avg_dict)
以上做法我们是将结果存入到新建的Excel的,如我们想要直接更新原始的Excel,用xlwt是无法做到的,但是openpyxl可以比较方便的实现此功能。我们在创建一个Excel文档并获取到sheet后,在表格的第一行和的最后一列之后添加一个新列,标题是“平均分”,然后遍历每一行,将每一行的第二列的值(也就是学生姓名)与字典表的键进行对应,若与键相同,则将值作为平均分,并写入到这一行的最后一列中。
## 修改原有的Excel
def update_excel(value_dict, fileName='D://Book3.xlsx'):
wb = openpyxl.load_workbook(fileName)
sheet = wb.get_sheet_by_name('Sheet1')
nrows = sheet.max_row
ncols = sheet.max_column
sheet.cell(1, ncols+1).value = '平均分' ## 在标题栏上添加一列平均分
## 遍历每一行,得到学生姓名,根据姓名在字典中查询到平均分,并写入到Excel中,实现更新Excel
for i in range(1,nrows):
for key in value_dict.keys():
name = sheet.cell(i+1,1).value
if name==key:
sheet.cell(i+1, ncols+1).value = value_dict[key]
wb.save(fileName)
update_excel(avg_dict)
更新后,效果如图。
更新结果
接下来,我们看看用pandas如何读写Excel,其实用pandas操作Excel数据是最方便的,pandas读取Excel成一个DataFrame,然后就可以使用pandas的函数对数据进行各种处理了。
导入pandas后,读取一个Excel只需要一行代码:
import pandas as pd
## 读取Excel
df = pd.read_excel('D://Book1.xlsx', sheet_name='Sheet1')
在jupyter中可以看到输出结果:
读取Excel
同样的,计算平均分也非常简单,也是只有一行代码:
## 用pandas获取每个学生平均分
df["平均分"] = df.mean(axis=1) #axis 0为列,1为行
这里其实就是对每一行求平均值,pandas会自动对数字型求和,行中有字符型数据也不会报错。
可以看到平均分已经计算出来了,并修改了Excel。
计算平均分并修改Excel
将修改后的结果出入到Excel依然只需要一行代码:
df.to_excel("D:/Book4.xlsx", index=False) ## 加入index=False,表示不需要写入索引
写入新的Excel
可以看到数据已经被写入到新的Excel中。
pandas确实是最方便的工具包,之前我们用xlrd,xlwt和openpyxl写了很多行代码的功能,在pandas中三句话就搞定了,效率之高的确值得肯定。
下一篇文章,我会研究一下怎么使用一些Python工具包对Excel表格调整格式。
微信公众“小晖程序”同步更新。
网友评论