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

RDKit调用Chem.MolFromSmiles批量转SMILES为mol对象报错排查

问题根因

代码存在两处问题,分别触发报错和逻辑错误:

  • 输入混入非法类型:报错明确提示传入了float类型对象,说明str_smiles列表并非全为字符串格式的SMILES,最常见的情况是读取表格类数据时,空SMILES被解析为float类型的NaN,RDKit底层基于C++实现,仅接收字符串类型输入,碰到浮点值就会抛出该类型转换错误。
  • 转换逻辑错误:Chem.MolFromSmiles()的返回值才是转换后的mol对象,现有代码未接收该返回值,直接将遍历得到的原始SMILES值追加到结果列表,即使不报错,最终得到的也不是目标mol对象。
修正方案

先清洗输入数据过滤非字符串空值,再正确接收转换结果,同时增加非法SMILES判断,避免无效值中断流程:

from rdkit import Chem
import math

mol_object_list = []
for smi in str_smiles:
    # 跳过float类型的空值NaN
    if isinstance(smi, float) and math.isnan(smi):
        continue
    # 去除首尾空白,兜底转字符串
    smi = str(smi).strip()
    if not smi:
        continue
    mol = Chem.MolFromSmiles(smi)
    # 仅保留转换成功的有效mol对象
    if mol is not None:
        mol_object_list.append(mol)

如果是通过pandas读取的数据集,可以在取SMILES列时先调用.dropna()去除空值,从源头避免float类型的空值混入列表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 05:30:47