使用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
相关产品推荐
相关产品推荐

