您的位置:首页 > 编程语言 > Python开发

使用python中openpyxl模块操作excel文件,计算单元格分子式的相对分子质量(二)

2018-02-04 18:26 701 查看
在(一)文中,在最后输出结果时,只是将相对分子质量的值输出,并未将对应的分子式输出,琢磨了一天,将改进的代码贴出来,希望大家可以给出点优化建议!

import openpyxl
import re

def massMr(s):#定义计算相对分子质量的函数,

list1 = ['O', 'N', 'C', 'H']
dict1 = {'O':16, 'N':14, 'C':12, 'H':1}

a = re.findall('\d+', s)

sum = 0

for i in range(4):

sum += int(dict1[list1[i]]) * int(a[i])

#    print('相对分子质量为:%d'% sum)

return sum

wb = openpyxl.load_workbook('Molecularformula-max-Mass.xlsx')
ws = wb.get_active_sheet()
#print(ws)
sheet = wb.get_sheet_by_name('Sheet1')#进入表单1

ws1 = wb.create_sheet(index = 1, title = 'Sheet2')#新建表单2

list1 = []

list3 = []

#print(sheet['A1'].value)
for i in range(1, int(sheet.max_row) + 1, 2):#对奇数行进行迭代
for j in range(1,int(sheet.max_column) + 1):#对列进行迭代,
if sheet.cell(row = i, column = j).value == None:#单元格为空,跳出循环
break

else:#单元格不为空,进行计算
cellMass = massMr(str(sheet.cell(row = i, column = j).value))
#dict1 = dict((cellMass, str(sheet.cell(row = i, column = j).value)))
#print(dict1)
list2 = list1.insert(0,[int(cellMass), str(sheet.cell(row = i, column = j).value)])
cellMass_max = max(list1)#使用max函数取相对分子质量最大的值,注意list1中的元素为列表(由两个元素构成)
list4 = list3.append(cellMass_max)#将cellMass_max生成列表
ws1.append(list3[0])#注意append时,参数需为列表,元祖等可迭代对象,此时需用list3[0],因为list3是由列表构成的列表
wb.save('Molecularformula-max-Mass.xlsx')#保存在原文件中,
list1 = []
list3 = []

输出结果为:

876O24N24C12H12
1284O35N35C18H18
1130O28N32C18H18
1387O33N40C23H23
1327O31N39C22H21
1065O24N31C19H19
1489O36N42C25H25
786O16N23C16H16
744O16N20C16H16
770O20N20C13H14
857O13N27C21H19
986O20N29C20H20
1860O44N54C31H28
981O23N29C16H15
849O25N21C12H11
1040O25N29C18H18
等。

应该注意的是,在倒数第四行:

ws1.append(list3[0])


中,应该append(list3[0])。首先append时,应为列表,元组等可迭代的对象;其次,list3本身是一个由列表元素(每个列表元素由两个元素构成,一个是整型的cellMass,另一个是字符串分子式)构成的列表,所以需要访问list3[0]。如果是用append(list3)的话,则会报错:cannot convert [876, 'O24N24C12H12'] to Excel。原因就是list3 = [[876, 'O24N24C12H12']]。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python openpyxl excel