一个脚本就能批量得到sdf化合物分子文件的五倍率描述符,生成一个excel表格!
首先,找个文件夹,将脚本放进文件夹中。然后创建一个名为linpinski_description_task的文件夹,把化合物分子放入linpinski_description_task文件夹中。然后执行脚本就得到csv表格了!
(注意sdf的文件不能有中文符号)
美中不足的是,当前的版本批量处理得到的描述符文件是这个样子的:
每个分子的具体信息上方都会出现列名。要解决这个问题很简单,使用excel的“数据”、“清楚重复项”,即可:
取消“数据包含标题”
具体代码:
from rdkit import Chem
from rdkit.Chem import Descriptors , AllChem
from rdkit.Chem import Lipinski
#lipinski五倍率规则
import xlwt
import pandas as pd
import os
def linpinski(file_dir):
for root,dirs,files in os.walk(file_dir):
for file in files:
if os.path.splitext(file)[1] == '.sdf':
sdf_name = str(file[:-4])
file_input = 'linpinski_description_task/' + sdf_name + '.sdf'
sdffile = Chem.SDMolSupplier(file_input)
mold = [i for i in sdffile]
table = [] #最后会变成字典
for i,mol in enumerate(mold):
smi=Chem.MolToSmiles(mol)
mw = Descriptors.ExactMolWt(mol)
logp = Descriptors.MolLogP(mol)
HBA = Lipinski.NumHAcceptors(mol)
HBD = Lipinski.NumHDonors(mol)
array={'name':'','smiles':'','mw':'','logP':'','HBA':'','HBD':''}
array['name']=sdf_name
array['smiles']=smi
array['mw']=mw
array['logP']=logp
array['HBA']=HBA
array['HBD']=HBD
table.append(array)
pf = pd.DataFrame(list(table))
order = ['name','smiles','mw','logP','HBA','HBD']
pf = pf[order]
print(pf)
pf.to_csv('五倍率描述符.csv',mode = 'a', encoding = 'utf-8')
#mode='a'将数据插入到已有表格中,而不是覆盖