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

使用RDKit批量转换SMI为SDF时遇NoneType错误求助

解决RDKit转换SMI到SDF时的NoneType错误

你遇到的rdkit.Chem.rdmolfiles.MolToMolFile(NoneType, str)错误,本质是Chem.MolFromSmiles(smi_mol)返回了None——要么是某个SMILES字符串格式无效,RDKit无法解析;要么是读取的行不符合预期(比如空行、没有拆分出SMILES和分子名称两部分)。

下面是修正后的代码,加入了错误处理和更安全的文件操作逻辑:

from rdkit import Chem

def convertir_smi_sdf(file_smi):
    converted_count = 0
    failed_smiles = []

    # 用with语句安全打开文件,自动处理关闭
    with open(file_smi, 'r') as f:
        lines = [line.strip() for line in f if line.strip()]  # 过滤空行并去除首尾空格
        print(f"Total de smi: {len(lines)}")

        for line in lines:
            parts = line.split()
            # 确保行能拆分出至少SMILES和名称两部分
            if len(parts) < 2:
                failed_smiles.append(f"格式错误:{line}")
                continue
            
            smi_mol = parts[0]
            nom_mol = parts[1]
            mol = Chem.MolFromSmiles(smi_mol)
            
            # 检查SMILES是否解析成功
            if mol is None:
                failed_smiles.append(f"无效SMILES:{smi_mol}")
                continue
            
            # 写入SDF文件
            Chem.MolToMolFile(mol, f'{nom_mol}.sdf')
            converted_count += 1

    print(f"Se ha convertido {converted_count} smiles a SDF")
    if failed_smiles:
        print("以下条目转换失败:")
        for fail in failed_smiles:
            print(f"- {fail}")

关键改进点:

  • 安全文件操作:用with语句打开文件,避免忘记关闭文件导致的资源泄漏
  • 过滤空行:跳过文件中的空行,避免拆分出错
  • 格式校验:检查每行是否能拆分出至少两个元素,防止索引越界
  • 无效SMILES处理:判断MolFromSmiles的返回值,跳过无法解析的SMILES并记录错误信息
  • 简化计数逻辑:直接用变量计数,无需额外列表

运行修正后的代码,你不仅能成功转换有效SMILES,还能看到哪些条目失败,方便排查问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 23:45:59