You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 10:24:13