化学信息学工具:RDKit 安装与基本操作

说实话,在GNN分子特征构建这条路上,RDKit就是你的瑞士军刀。
没有它,后面所有的图构建、特征提取都是空中楼阁。
我早期做分子性质预测时,折腾过各种商业化库,最后还是老老实实回到RDKit。
为啥?开源、社区活跃、功能全,关键还免费。

这一章,我们把它装好,再跑通最基础的分子读写和可视化流程。
别小看这一步,越基础的东西,后面出问题越能救命。

第二章 · 知识体系 环境配置 Conda / Pip / 验证 分子文件操作 SDF / SMILES / 读写 分子可视化 2D / 3D / SVG渲染 RDKit 核心数据模型 Atom / Bond / Mol / RWMol / Chem.MolFromSmiles 输入到GNN分子图构建 本章从环境配置 → 文件操作 → 可视化,最终服务于GNN分子图构建

2.1 环境准备:先把RDKit请进你的电脑

安装RDKit,我强烈推荐用conda。
为什么?

RDKit的C++核心和Python接口绑定非常紧,
用pip安装偶尔会踩二进制兼容的坑。
conda直接帮你把所有依赖安好,省心省力。

我的建议:
如果你刚开始,直接在conda里新建一个环境,专门给GNN课程用。
后面装PyTorch Geometric什么的也方便。

好,我们来一步步操作。

第一步:创建并激活conda环境

conda create -n gnn_mol python=3.9
conda activate gnn_mol

第二步:安装RDKit

conda install -c conda-forge rdkit

嗯,这里要注意:conda-forge通道的更新频率很高。
我习惯指定版本,比如:

conda install -c conda-forge rdkit=2023.09.1

第三步:验证是否安装成功

python -c "from rdkit import Chem; print(Chem.__version__)"

如果看到类似 2023.09.1 的输出,恭喜你,安装成功。

避坑指南:
我早期调包时最怕conda环境冲突。如果你装的包太多,建议先跑 conda list | grep rdkit 看看。万一版本不对,别硬搞,删环境重来最快。

2.2 分子文件读取:从硬盘到内存

RDKit支持十几种分子文件格式。
我们最常用的就两种:SDF 和 SMILES。

SDF是结构数据文件,里面存的是原子坐标、键信息、甚至自定义属性。
SMILES呢?就是一串字符,比如 CCO 代表乙醇。
别看它短,信息量一点不少。

个人经验:
我在项目中做高通量虚拟筛选时,SDF文件用来存分子的3D构象,SMILES则用来快速获取分子图拓扑。两者配合,效果最好。

2.2.1 从SMILES读取分子

这是入门第一行代码,我打赌你以后天天用:

from rdkit import Chem

mol = Chem.MolFromSmiles('CCO')
print(mol.GetNumAtoms())   # 输出 3
print(mol.GetNumBonds())   # 输出 2

是不是很简单?
但有个坑:MolFromSmiles 如果遇到非法SMILES,会返回 None。
我建议你养成习惯,加个判断:

mol = Chem.MolFromSmiles('这不是合法SMILES')
if mol is None:
    print('解析失败,检查SMILES字符串')

2.2.2 从SDF文件读取分子

SDF文件可以存储多个分子,称为一个 SD Mol Supplier。

from rdkit import Chem

supplier = Chem.SDMolSupplier('molecules.sdf')
for mol in supplier:
    if mol is not None:
        print(mol.GetNumAtoms())

嗯,这里我吃过亏。
有时候SDF文件里某些分子损坏了,supplier 会返回 None。
所以遍历时一定要判空,不然程序直接崩。

2.3 分子写入:从内存到硬盘

读取没问题了,我们再来看看怎么写出去。

2.3.1 写入SMILES

from rdkit import Chem

mol = Chem.MolFromSmiles('CCO')
smiles = Chem.MolToSmiles(mol)
print(smiles)  # 输出: CCO

注意:MolToSmiles 可以接受参数,比如 canonical=True 来生成标准SMILES。
我习惯对分子做标准化,方便后面去重。

2.3.2 写入SDF文件

from rdkit import Chem
from rdkit.Chem import AllChem

mol = Chem.MolFromSmiles('CCO')
mol = Chem.AddHs(mol)
AllChem.EmbedMolecule(mol, AllChem.ETKDG())
AllChem.UFFOptimizeMolecule(mol)

writer = Chem.SDWriter('ethanol.sdf')
writer.write(mol)
writer.close()

这段代码做了三件事:加氢、生成3D构象、力场优化。
最后把优化后的分子写进SDF文件。
你打开文件看看,里面会有原子坐标和键信息。

文件格式读取方法写入方法主要用途
SMILES (.smi)Chem.MolFromSmiles()Chem.MolToSmiles()快速交换、数据库存储
SDF (.sdf)Chem.SDMolSupplier()Chem.SDWriter()3D构象、属性附加
MOL (.mol)Chem.MolFromMolFile()Chem.MolToMolFile()单个分子结构数据
PDB (.pdb)Chem.MolFromPDBFile()Chem.MolToPDBFile()蛋白质-配体复合物

2.4 分子可视化:看看分子长什么样

读写了半天,总得看看分子长啥样吧?
RDKit自带的可视化能力很强,而且不需要Jupyter也能生成图像。

2.4.1 2D结构绘制

生成2D图是最常用的操作:

from rdkit import Chem
from rdkit.Chem import Draw

mol = Chem.MolFromSmiles('CCO')
img = Draw.MolToImage(mol, size=(300, 200))
img.save('ethanol_2d.png')

画出来的图像是PNG格式,清晰度不错。
但如果你要做网页展示,我更推荐用SVG:

svg = Draw.MolToSVG(mol, size=(300, 200))
with open('ethanol_2d.svg', 'w') as f:
    f.write(svg)
我的习惯:
批量生成分子结构图时,我会把SVG直接嵌入HTML页面,这样拿浏览器打开就能看到所有分子的结构,非常直观。
而且SVG是矢量图,缩放不失真。

2.4.2 3D结构展示

3D可视化需要额外安装 py3Dmol 或者 nglview。
但RDKit自身也能导出3D坐标的XML格式:

from rdkit.Chem import AllChem

mol = Chem.MolFromSmiles('CCO')
mol = Chem.AddHs(mol)
AllChem.EmbedMolecule(mol, AllChem.ETKDG())
AllChem.UFFOptimizeMolecule(mol)

# 导出为MolBlock,可被其他可视化工具读取
mb = Chem.MolToMolBlock(mol)
print(mb[:300])  # 打印前300个字符看看

说实话,3D可视化在GNN中不是必须的。
你构建的分子图,本质上用的是原子连接关系和3D距离,不需要你肉眼去看。
不过,调试阶段可视化一下,能帮你快速确认构象是否合理。

2.5 本章小结

我们做了几件很具体的事:

  • 装好了RDKit,确保环境没问题
  • 从SMILES和SDF读取了分子
  • 把分子写回SMILES和SDF文件
  • 生成2D结构图,保存为PNG和SVG

这些操作,看起来基础,却是后续所有GNN特征构建的基石。
我当年第一次跑通分子可视化时,看着乙醇的结构图,心里还挺激动的。
嗯,别笑,做分子的人,这点仪式感还是得有。

核心记忆点:
- Chem.MolFromSmiles() 是万能入口
- 读取文件时务必判空
- SVG可视化适合批量展示,PNG适合报告插图
- 3D构象要加氢+嵌入+优化三步