在(一)文中,在最后输出结果时,只是将相对分子质量的值输出,并未将对应的分子式输出,琢磨了一天,将改进的代码贴出来,希望大家可以给出点优化建议!
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 = []
输出结果为:
876 | O24N24C12H12 | |
1284 | O35N35C18H18 | |
1130 | O28N32C18H18 | |
1387 | O33N40C23H23 | |
1327 | O31N39C22H21 | |
1065 | O24N31C19H19 | |
1489 | O36N42C25H25 | |
786 | O16N23C16H16 | |
744 | O16N20C16H16 | |
770 | O20N20C13H14 | |
857 | O13N27C21H19 | |
986 | O20N29C20H20 | |
1860 | O44N54C31H28 | |
981 | O23N29C16H15 | |
849 | O25N21C12H11 | |
1040 | O25N29C18H18 |
等。
应该注意的是,在倒数第四行:
ws1.append(list3[0])
中,应该append(list3[0])。首先append时,应为列表,元组等可迭代的对象;其次,list3本身是一个由列表元素(每个列表元素由两个元素构成,一个是整型的cellMass,另一个是字符串分子式)构成的列表,所以需要访问list3[0]。如果是用append(list3)的话,则会报错:cannot convert [876, 'O24N24C12H12'] to Excel。原因就是list3 = [[876, 'O24N24C12H12']]。