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

使用RDKit获取吗啡分子原子数遇转换错误及NoneType异常求助

问题描述

我在VSCode中用pip安装的RDKit写代码,想计算吗啡分子的原子数,代码和参考教程差不多,但一直报错。

错误信息

[17:11:25] Cannot convert '<!-' to unsigned int on line 4
Traceback (most recent call last):
  File "c:\Users\frede\OneDrive\Skrivebord\Projekter\Python\Kemi\main.py", line 9, in <module>
    text = morphine.GetNumAtoms()
           ^^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'GetNumAtoms'

我的代码

from rdkit import Chem
import requests

morphine_url = 'https://go.drugbank.com/structures/small_molecule_drugs/DB00295.mol'
morphine_mol = requests.get(morphine_url).text

morphine = Chem.MolFromMolBlock(morphine_mol)

text = morphine.GetNumAtoms()

print(text)

最困惑的是Cannot convert '<!-' to unsigned int on line 4这个错误,找不到'<!-'的含义。补充:Drugbank中该分子的实际mol文件内容如下:

295
  Mrv1909 06162015202D          

 24 28  0  0  1  0            999 V2000
    2.3452    0.0738    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
    2.1443   -2.0555    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
    2.1443    2.1117    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
    5.7533   -0.7968    0.0000 N   0  0  0  0  0  0  0  0  0  0  0  0
    3.6100   -0.3844    0.0000 C   0  0  1  0  0  0  0  0  0  0  0  0
    4.3245   -0.7968    0.0000 C   0  0  2  0  0  0  0  0  0  0  0  0
    5.0389   -0.3843    0.0000 C   0  0  1  0  0  0  0  0  0  0  0  0
    2.8955   -0.7968    0.0000 C   0  0  2  0  0  0  0  0  0  0  0  0
    4.0866    0.2205    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    3.6100    0.4405    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    5.0390    0.4404    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    5.2599    0.2206    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    4.3244    0.8530    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    2.8955   -1.6219    0.0000 C   0  0  2  0  0  0  0  0  0  0  0  0
    4.3245   -1.6218    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    2.8954    0.8530    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    3.6100   -2.0343    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    6.3444   -1.4318    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    4.3245    1.6779    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    2.8955    1.6780    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    3.6099    2.0903    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    4.7705   -1.3284    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
    5.2769   -1.0363    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
    2.2291   -0.9899    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
  1  8  1  0  0  0  0
  1 16  1  0  0  0  0
 14  2  1  6  0  0  0
  3 20  1  0  0  0  0
  4  7  1  0  0  0  0
  4 12  1  0  0  0  0
  4 18  1  0  0  0  0
  5  6  1  0  0  0  0
  5  8  1  0  0  0  0
  5  9  1  1  0  0  0
  5 10  1  0  0  0  0
  6  7  1  0  0  0  0
  6 15  1  0  0  0  0
  6 22  1  1  0  0  0
  7 11  1  0  0  0  0
  7 23  1  6  0  0  0
  8 14  1  0  0  0  0
  8 24  1  1  0  0  0
  9 12  1  0  0  0  0
 10 13  2  0  0  0  0
 10 16  1  0  0  0  0
 11 13  1  0  0  0  0
 13 19  1  0  0  0  0
 14 17  1  0  0  0  0
 15 17  2  0  0  0  0
 16 20  2  0  0  0  0
 19 21  2  0  0  0  0
 20 21  1  0  0  0  0
M  END

问题分析与解决

1. 错误根源

  • Cannot convert '<!-' to unsigned int 这个提示的本质是:你用requests.get获取的不是mol文件,而是Drugbank的登录页面HTML(<DOCTYPE html>的起始字符被截断成了<!-)。因为Drugbank的该URL需要登录验证,未授权请求会返回HTML页面而非目标mol数据。
  • 后续的AttributeError是因为Chem.MolFromMolBlock无法解析无效的HTML内容,返回了None,调用GetNumAtoms()自然会报错。

2. 修复方案

方式一:本地加载已知的mol文件

把你补充的吗啡mol内容保存为morphine.mol,放在代码同目录下,修改代码读取本地文件:

from rdkit import Chem

# 读取本地mol文件
with open('morphine.mol', 'r') as f:
    morphine_mol = f.read()

morphine = Chem.MolFromMolBlock(morphine_mol)
if morphine:
    print(morphine.GetNumAtoms())
else:
    print("无法解析mol文件")

方式二:使用无需验证的公开数据源

比如用PubChem的API获取吗啡的mol数据,无需登录即可访问:

from rdkit import Chem
import requests

# PubChem中吗啡的CID为5288826
morphine_url = 'https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound/CID/5288826/SDF'
response = requests.get(morphine_url)
if response.status_code == 200:
    morphine = Chem.MolFromMolBlock(response.text)
    if morphine:
        print(morphine.GetNumAtoms())
    else:
        print("无法解析mol文件")
else:
    print(f"请求失败,状态码: {response.status_code}")

3. 额外提示

调用Chem.MolFromMolBlock后一定要先判断返回值是否为None,避免后续调用方法时抛出AttributeError。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 23:42:03