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

如何保存RDKit DrawMorganBit输出图像并解决kekulize报错

问题修复方案

两个报错的根因和对应修改方法如下:

1. KekulizeException 异常修复

这个报错由两个因素共同导致:

  • 加载分子后未做标准化预处理,结构中含硫、氮的五元杂环芳香性标记没有被正确识别
  • RDKit 2022.x版本的DrawMorganBit接口默认会对提取的指纹子结构片段做凯库勒化,截断的局部子结构无法匹配标准凯库勒式的双键排布规则,直接抛出异常
    修复操作:
  • 加载SMILES后增加分子合法性校验、结构标准化步骤
  • 调用DrawMorganBit时传入kekulize=False参数,关闭强制凯库勒化,直接基于芳香性标记绘图

2. 图像保存 AttributeError 异常修复

报错根因:传入useSVG=True参数时,DrawMorganBit返回的不是PIL图像对象,是SVG格式的字符串文本,字符串类型不存在save()方法,调用时必然报错。
对应两种保存方案二选一即可:

  • 方案一:需要存PNG等位图格式:把useSVG改为False,拿到PIL Image对象后再调用save方法
  • 方案二:需要矢量SVG格式:直接把返回的字符串写入后缀为.svg的文件即可
    注意原代码循环中所有比特位的图都使用同一个文件名保存,后生成的图会覆盖之前的文件,需要给文件名加上对应比特位的编号做区分。

修正后可直接运行的完整代码

import numpy as np
from rdkit import Chem
from rdkit.Chem import Draw, AllChem, DataStructs

# 加载并预处理分子
smiles = 'O=C1N([C@@H](C)C2CC2)CC3=CC(C4=C(C)N=C(NC(C)=O)S4)=CC(S(=O)(C)=O)=C31'
mol = Chem.MolFromSmiles(smiles)
# 校验分子是否解析成功
if mol is None:
    raise ValueError("输入SMILES解析失败,请检查结构正确性")
# 结构标准化:修正芳香性、键级等标记
Chem.SanitizeMol(mol)

bi = {}
fp = AllChem.GetMorganFingerprintAsBitVect(mol, radius=3, bitInfo=bi)

fp_arr = np.zeros(1,)
DataStructs.ConvertToNumpyArray(fp, fp_arr)
fp_arr = np.nonzero(fp_arr)[0]

# 保存PNG格式子结构图
for bit_id in fp_arr:
    img = Draw.DrawMorganBit(mol, bit_id, bi, useSVG=False, kekulize=False)
    # 文件名增加比特位编号,避免覆盖
    img.save(f"submol_bit_{bit_id}.png")

# 若需要保存SVG矢量图,替换上面的循环为以下代码即可
# for bit_id in fp_arr:
#     svg_content = Draw.DrawMorganBit(mol, bit_id, bi, useSVG=True, kekulize=False)
#     with open(f"submol_bit_{bit_id}.svg", "w", encoding="utf-8") as f:
#         f.write(svg_content)

内容的提问来源于stack exchange,提问作者Park

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 15:27:17