如何在Python3中使用RDKit为SDF文件添加分子属性
用RDKit给SDF文件中的分子添加ID属性
我是RDKit新手,问题比较基础还请见谅。我有一个包含多个分子的SDF文件,想给每个分子条目添加<ID>属性,属性值就是每个分子开头的标识(比如示例里的D00AAN、D00AAU),该怎么实现?
输入示例
D00AAN -OEChem-10101305022D 100108 0 1 0 0 0 0 0999 V2000 2.0000 5.1929 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 5.2896 2.9173 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 6.3905 -0.2731 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 3.8629 -5.1929 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 1 53 1 0 0 0 0 2 5 1 0 0 0 0 2 6 2 0 0 0 0 M END $$$$ D00AAU -OEChem-10101305022D 42 43 0 1 0 0 0 0 0999 V2000 6.3301 3.2500 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 2.0000 -3.2500 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 4.5981 0.2500 0.0000 C 0 0 3 0 0 0 0 0 0 0 0 0 1 15 1 0 0 0 0 1 41 1 0 0 0 0 2 16 1 0 0 0 0 2 42 1 0 0 0 0 3 4 1 0 0 0 0 3 5 1 0 0 0 0 3 8 1 0 0 0 0 M END $$$$
预期输出
D00AAN -OEChem-10101305022D 100108 0 1 0 0 0 0 0999 V2000 2.0000 5.1929 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 5.2896 2.9173 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 6.3905 -0.2731 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 3.8629 -5.1929 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 1 53 1 0 0 0 0 2 5 1 0 0 0 0 2 6 2 0 0 0 0 M END > <ID> D00AAN $$$$ D00AAU -OEChem-10101305022D 42 43 0 1 0 0 0 0 0999 V2000 6.3301 3.2500 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 2.0000 -3.2500 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 4.5981 0.2500 0.0000 C 0 0 3 0 0 0 0 0 0 0 0 0 1 15 1 0 0 0 0 1 41 1 0 0 0 0 2 16 1 0 0 0 0 2 42 1 0 0 0 0 3 4 1 0 0 0 0 3 5 1 0 0 0 0 3 8 1 0 0 0 0 M END > <ID> D00AAU $$$$
解决方案
用RDKit的Python API可以轻松实现这个需求,步骤如下:
- 读取SDF文件中的所有分子
- 每个分子的开头标识对应RDKit中分子的
_Name属性(SDF第一行默认作为分子名称) - 给每个分子添加
<ID>属性,值为该分子的_Name - 将修改后的分子写入新的SDF文件
代码实现
from rdkit import Chem from rdkit.Chem import SDWriter # 读取输入SDF文件 suppl = Chem.SDMolSupplier("input.sdf") # 创建输出SDF文件的写入器 writer = SDWriter("output.sdf") for mol in suppl: if mol is not None: # 跳过读取失败的分子 # 获取分子开头的标识(即SDF第一行的内容) mol_id = mol.GetProp("_Name") # 添加<ID>属性 mol.SetProp("ID", mol_id) # 写入修改后的分子 writer.write(mol) # 关闭写入器 writer.close()
说明
Chem.SDMolSupplier用于读取SDF文件,返回可迭代的分子对象mol.GetProp("_Name")获取SDF中每个分子的第一行内容,也就是你需要的标识mol.SetProp("ID", mol_id)给分子添加名为ID的属性,RDKit在写入SDF时会自动格式化为> <ID> 值的形式- 记得处理
mol is None的情况,避免读取无效分子时报错
内容的提问来源于stack exchange,提问作者rshar
相关产品推荐
相关产品推荐

