pysmiles:一个用于读写SMILES表达式的python库
技术背景
SMILES表达式是化学里面常用的用于标定元素之间关系的字符串,旨在用最简短的语句来完整的表达一个分子体系内所蕴含的基本信息,比如元素、连接性以及连接属性等。由于SMILES表达式的定义种类太多,需要完整介绍的可以阅读这篇博客或者是opensmiles的官方网站。这里我们简单介绍几种常见的情况:
- 在SMILES表达式中,往往会去掉\(H\)元素,比如甲烷\(CH_4\)用SMILES表达式来表达的话就是\(C\);
- 双键用\(=\)来表示,比如\(C(=O)=O\)表示一个二氧化碳;
- 三键用\(#\)来表示,用法与双键一样;
- 主干线不加标记,分支加圆括号,比如上面提到的二氧化碳,第一个\(O\)原子不在主分支上,因此加了括号;
- 不成键的分子之间用
.隔开,比如\(O.C(=O)=O\)表示一个水分子和一个二氧化碳分子; - 成环的要打开来写,并在开头和结尾加上断键标记,比如\(C1CCCCC1\)表示一个环己烷\(C_6H_{12}\),这里的两个
1前所对应的碳是相互连接的。
诸如此类的复杂的化学表达式解析,最好是能够有一个方便使用的工具来进行转化,这里介绍的是其中一款:pysmiles。

pysmiles的安装
pysmiles是一个纯粹用python写的sdk,其中借用了networkx的框架来存储元素之间的键连信息。那么我们可以直接使用pip来进行安装和管理:
dechin@ubuntu2004:~/projects/gitlab/dechin/src/smile$ python3 -m pip install pysmiles
Collecting pysmiles
Downloading pysmiles-1.0.1.tar.gz (34 kB)
Collecting pbr
Using cached pbr-5.6.0-py2.py3-none-any.whl (111 kB)
Requirement already satisfied: networkx~=2.0 in /home/dechin/anaconda3/lib/python3.8/site-packages (from pysmiles) (2.5)
Requirement already satisfied: decorator>=4.3.0 in /home/dechin/anaconda3/lib/python3.8/site-packages (from networkx~=2.0->pysmiles) (4.4.2)
Building wheels for collected packages: pysmiles
Building wheel for pysmiles (setup.py) ... done
Created wheel for pysmiles: filename=pysmiles-1.0.1-py2.py3-none-any.whl size=22016 sha256=9c9bf6bf2f1667bfdb0d9a3c96f6d4499b7749b0ba4fc63ff45512c9dd1af8db
Stored in directory: /home/dechin/.cache/pip/wheels/1b/ae/65/19c5062b483dbf3a22b8a42e32dfe1bdfc17f3d31b475e0d2f
Successfully built pysmiles
Installing collected packages: pbr, pysmiles
Successfully installed pbr-5.6.0 pysmiles-1.0.1
因为并没有什么特殊的依赖关系,所以安装还是比较顺利的。
pysmiles的使用
这里我们通过一个简单的案例来展示一下pysmiles的使用方法(其中关于networkx的使用,可以参考这一篇博客):
from pysmiles import read_smiles
import networkx as nx
import matplotlib.pyplot as plt
smiles = 'N#CC#N' # 给定的SMILES表达式
mol = read_smiles(smiles) # 读取到一个networkx的网络结构中
print(mol.nodes) # 打印节点信息
print(mol.edges) # 打印边信息
print(nx.to_numpy_matrix(mol)) # 打印邻接矩阵信息
elements = nx.get_node_attributes(mol, name = "element")
nx.draw(mol, with_labels=True, labels=elements)
plt.savefig('pysmiles.png') # 保存图层
上述是一个简单的SMILES表达式读取的程序,执行的结果如下所示:
dechin@ubuntu2004:~/projects/gitlab/dechin/src/smile$ python3 pysmiles_test.py
[0, 1, 2, 3]
[(0, 1), (1, 2), (2, 3)]
[[0. 1. 0. 0.]
[1. 0. 1. 0.]
[0. 1. 0. 1.]
[0. 0. 1. 0.]]
同时会在当前目录下生成一个利用networkx画出来的简单图片:

当然,这个结构有点过于的简单,如果对于分子模型的展示稍微有点追求的话,可以参考这篇文章所介绍的vmd的使用方法。由于这里我们只是倾向于使用pysmiles的阅读功能,如果要使用pysmiles的写入功能,可以参考如下官方案例,这里不做过多的展开:
import networkx as nx
from pysmiles import write_smiles, fill_valence
mol = nx.Graph()
mol.add_edges_from([(0, 1), (1, 2), (1, 3), (3, 4), (1, 5), (3, 6)])
for idx, ele in enumerate('CCCCOCO'):
mol.nodes[idx]['element'] = ele
mol.nodes[4]['charge'] = -1
mol.nodes[4]['hcount'] = 0
mol.edges[3, 6]['order'] = 2
print(write_smiles(mol))
# [O-]C(=O)C([C])([C])[C]
fill_valence(mol, respect_hcount=True)
print(write_smiles(mol))
# [O-]C(=O)C(C)(C)C
其实本质上也是通过构建一个networkx的数据结构,再通过这个数据结构去产生一个smiles的字符串。
总结概要
本文介绍了一款基于python语言的SMILES化学表达式的读写SDK,使用openSMILES表达式所定义的分子结构是非常精简的,但是其中的规则又非常的多,因此使用一款友好的SMILES表达式能够大大的缩减解析的成本。并且pysmiles结合了一款非常常用的python的拓扑网络结构表示SDK——networkx,使得对SMILES表达式的结果分析更加的人性化。
版权声明
本文首发链接为:https://www.cnblogs.com/dechinphy/p/pysmiles.html
作者ID:DechinPhy
更多原著文章请参考:https://www.cnblogs.com/dechinphy/
pysmiles:一个用于读写SMILES表达式的python库的更多相关文章
- 3 个用于数据科学的顶级 Python 库
使用这些库把 Python 变成一个科学数据分析和建模工具. Python 的许多特性,比如开发效率.代码可读性.速度等使之成为了数据科学爱好者的首选编程语言.对于想要升级应用程序功能的数据科学家和机 ...
- 8 个用于业余项目的优秀 Python 库
在 Python/Django 的世界里有这样一个谚语:为语言而来,为社区而留.对绝大多数人来说的确是这样的,但是,还有一件事情使得我们一直停留在 Python 的世界里,不愿离开,那就是我们可以很容 ...
- 一个用于实现并行执行的 Java actor 库
即使 Java 6 和 Java 7 中引入并发性更新,Java 语言仍然无法让并行编程变得特别容易.Java 线程.synchronized 代码块.wait/notify 和java.util.c ...
- 一个随机切换user_agent的第三方python库:my_fake_useragent
因为my_fake_useragent 是第三方,所以需要自己进行安装. 不用担心,它没有任何依赖或者附加环境,只安装它自己就行. 方法1: pycharm传统安装方式. 方法2: pip insta ...
- Python 库大全
作者:Lingfeng Ai链接:http://www.zhihu.com/question/24590883/answer/92420471来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非 ...
- 哪些 Python 库让你相见恨晚?【转】
原文链接:https://www.zhihu.com/question/24590883/answer/92420471 原文链接:Python 资源大全 ---------------- 这又是一个 ...
- Python库,让你相见恨晚的第三方库
环境管理 管理 Python 版本和环境的工具 p – 非常简单的交互式 python 版本管理工具.pyenv – 简单的 Python 版本管理工具.Vex – 可以在虚拟环境中执行命令.virt ...
- Python资源 --Python库
环境管理 管理 Python 版本和环境的工具 pyenv – 简单的 Python 版本管理工具. Vex – 可以在虚拟环境中执行命令. virtualenv – 创建独立 Python 环境的工 ...
- python 库资源大全
偶然的机会翻到这篇文章,很全面,来源: Python 资源大全中文版 哪些 Python 库让你相见恨晚? 环境管理 管理 Python 版本和环境的工具 p:非常简单的交互式 pyth ...
随机推荐
- IDEA的注册方式
http://idea.lanyus.com/ 使用前请将"0.0.0.0 account.jetbrains.com"添加到hosts文件中 hosts文件在C:\Windows ...
- python实现顺序表
python实现顺序表可以有两中形式进行存储 列表 元组 其实简单来说,顺序表无非就是操作列表和元组的方法来对顺序表进行操作. 实例代码 7 class SqList: 8 def __init__( ...
- python3表格数据处理
技术背景 数据处理是一个当下非常热门的研究方向,通过对于大型实际场景中的数据进行建模,可以用于预测下一阶段可能出现的情况.比如我们有过去的2002年-2018年的黄金价格的数据: 该数据来源于Gite ...
- 面试高频题:说一说对Spring和SpringMvc父子容器的理解?
引言 以前写了几篇关于SpringBoot的文章<面试高频题:springBoot自动装配的原理你能说出来吗>.<保姆级教程,手把手教你实现一个SpringBoot的starter& ...
- 分享一次排查CLOSE_WAIT过多的经验
关键词:TCP.CLOSE_WAIT 问题背景 某日下午有测试人员急匆匆的跑来跟我反馈:"有客户反馈供应商附件预览不了,流程阻塞,需要紧急处理",我立马精神起来,毕竟都是付费客户( ...
- [深搜]A. 【例题1】拔河比赛
A . [ 例 题 1 ] 拔 河 比 赛 A. [例题1]拔河比赛 A.[例题1]拔河比赛 解析 模板题,选与不选 Code #include <bits/stdc++.h> #defi ...
- oo暑期课程总结
一.当时未能完成的作业 未能完成的作业是第四单元的作业. 未能完成的原因主要有以下两点:一是当时对于数据的整理没有好的设计和思路:二是临近期末,未能合理地分配时间导致作业未能完成 二.改进的部分 通过 ...
- 吃透什么是KVM虚拟化
概念: 云计算自从提出,一直没有一个明确而统一的定义.维基百科对云计算做了如下的描述:云计算是一种通过因特网以服务的方式提供动态可伸缩的虚拟化的资源的计算模式.美国国家标准与技术研究院( NIST)定 ...
- springboot项目整合mybatis
记录创建springboot项目并配置mybatis中间件: 资源准备及版本说明 编程工具:IDEA JDK版本:1.8 Maven版本:Apache Maven 3.6.3 springboot版本 ...
- Ambassador-08-跨域
官方文档:https://www.getambassador.io/docs/latest/topics/using/cors/ Cross-Origin Resource Sharing-CORS ...