python学习笔记:读取mol2文件

xyz 和mol2的文件在日常使用过程是十分常见。mol2的格式也十分独特,在实验的过程当中,需要对一些数据进行大量清洗方可以达到使用目标。

例如单独对碳,氢进行加工使用,例如抽取一个苯环来做探索分子间的作用力的探索等等。这个过程就要一点点对mol2文件进行加工。

在这里插入图片描述

1.写法众多,思路倾向目的一致

我查看了几种关于mol2解析的写法,有一些写法很高级,也有一些符合初级的写法。
大概我举例,常见一种思路是采取遍历方式对整个文件进行遍历操作。
这里就可以采用for in 或者while 循环去解析出来。
还有一些会采取迭代器去处理,这种对存储和内存优化会好一些,只不过这种方式读取没有list那样直观。

1.1 读取mol2文件

mol2的文件有一个结构记录了一些原子数据。从@ATOM 到 @BOND里面,至于@BOND 这里记录一些链接的信息,但是我们并不需要这部分数据。因此在解析文件当中只需要截取一段数据即可。

@ATOM
…只需要这里数据
@BOND

### 
### Created by X-TOOL on Mon Sep 10 21:12:46 2018
### 

@<TRIPOS>MOLECULE
1a52_ligand
   44    47     1     0     0
SMALL
GAST_HUCK


@<TRIPOS>ATOM
      1 C1        107.0080   15.8600   99.4560 C.ar      1 EST        -0.0749
      2 C2        106.9320   16.9300  100.3660 C.ar      1 EST        -0.0468
      3 C3        106.8330   18.2290   99.8920 C.ar      1 EST         0.0739
      4 O3        106.8010   19.2390  100.8130 O.3       1 EST        -0.3393
      5 C4        106.7930   18.5030   98.4870 C.ar      1 EST        -0.0385
      6 C5        106.8760   17.4240   97.5440 C.ar      1 EST        -0.0491
      7 C6        106.9380   17.7140   96.0430 C.3       1 EST        -0.0236
      8 C7        107.3090   16.5030   95.1650 C.3       1 EST        -0.0396
      9 C8        106.6720   15.1910   95.6810 C.3       1 EST        -0.0259
     10 C9        107.1900   14.8700   97.1230 C.3       1 EST        -0.0116
     11 C10       106.9980   16.0650   98.0500 C.ar      1 EST        -0.0484
     12 C11       106.5900   13.5520   97.6420 C.3       1 EST        -0.0421
     13 C12       106.7820   12.3640   96.6670 C.3       1 EST        -0.0433
     14 C13       106.3220   12.6680   95.2400 C.3       1 EST        -0.0028
     15 C14       107.0200   13.9910   94.7660 C.3       1 EST        -0.0285
     16 C15       106.7430   14.0160   93.2620 C.3       1 EST        -0.0469
     17 C16       106.9650   12.5440   92.8370 C.3       1 EST        -0.0261
     18 C17       106.8760   11.6910   94.1710 C.3       1 EST         0.0609
     19 O17       106.1970   10.4170   93.9680 O.3       1 EST        -0.3912
     20 C18       104.7600   12.6910   95.1400 C.3       1 EST        -0.0569
     21 H1        107.0763   14.8482   99.8391 H         1 EST         0.0511
     22 H2        106.9508   16.7397  101.4330 H         1 EST         0.0468
     23 H3        106.0503   19.1223  101.3833 H         1 EST         0.2457
     24 H4        106.7001   19.5244   98.1359 H         1 EST         0.0462
     25 H5        107.6897   18.4998   95.8771 H         1 EST         0.0410
     26 H6        105.9503   18.0781   95.7238 H         1 EST         0.0410
     27 H7        108.4030   16.3888   95.1628 H         1 EST         0.0290
     28 H8        106.9575   16.6880   94.1392 H         1 EST         0.0290
     29 H9        105.5796   15.3173   95.7067 H         1 EST         0.0326
     30 H10       108.2753   14.7077   97.0478 H         1 EST         0.0429
     31 H11       105.5121   13.6994   97.8043 H         1 EST         0.0286
     32 H12       107.0737   13.3008   98.5975 H         1 EST         0.0286
     33 H13       106.2049   11.5068   97.0441 H         1 EST         0.0273
     34 H14       107.8504   12.1037   96.6408 H         1 EST         0.0273
     35 H15       108.1072   13.8650   94.8756 H         1 EST         0.0311
     36 H16       107.4438   14.6864   92.7429 H         1 EST         0.0269
     37 H17       105.7104   14.3345   93.0563 H         1 EST         0.0269
     38 H18       107.9545   12.4248   92.3715 H         1 EST         0.0290
     39 H19       106.1856   12.2283   92.1278 H         1 EST         0.0290
     40 H20       107.8995   11.4310   94.4789 H         1 EST         0.0599
     41 H21       106.6710    9.9062   93.3223 H         1 EST         0.2098
     42 H22       104.3545   13.3814   95.8943 H         1 EST         0.0236
     43 H23       104.3661   11.6797   95.3192 H         1 EST         0.0236
     44 H24       104.4617   13.0282   94.1363 H         1 EST         0.0236
@<TRIPOS>BOND
     1    1    2 ar 
     2    1   11 ar 
     3    2    3 ar 
     4    3    4 1  
     5    3    5 ar 
     6    5    6 ar 
     7    6    7 1  
     8    6   11 ar 
     9    7    8 1  
    10    8    9 1  
    11    9   10 1  
    12    9   15 1  
    13   10   11 1  
    14   10   12 1  
    15   12   13 1  
    16   13   14 1  
    17   14   15 1  
    18   14   18 1  
    19   14   20 1  
    20   15   16 1  
    21   16   17 1  
    22   17   18 1  
    23   18   19 1  
    24    1   21 1  
    25    2   22 1  
    26    4   23 1  
    27    5   24 1  
    28    7   25 1  
    29    7   26 1  
    30    8   27 1  
    31    8   28 1  
    32    9   29 1  
    33   10   30 1  
    34   12   31 1  
    35   12   32 1  
    36   13   33 1  
    37   13   34 1  
    38   15   35 1  
    39   16   36 1  
    40   16   37 1  
    41   17   38 1  
    42   17   39 1  
    43   18   40 1  
    44   19   41 1  
    45   20   42 1  
    46   20   43 1  
    47   20   44 1  
@<TRIPOS>SUBSTRUCTURE
     1 EST         1


1.2 使用python读取mol2文件

python 读取里面文件,并对其进行遍历处理。这种方式处理起来比较简单。只需要截取一段我们要的数据即可。

def read_mol2_file(filename):
    atoms = []
    with open(filename, 'r') as f:
        all_line = f.read().split("\n")
        begin = False
        for line in all_line:
            if line.startswith("@<TRIPOS>ATOM"):
                begin = True
                continue
            if line.startswith("@<TRIPOS>BOND"):
                break
            if begin:
                atoms.append(line.rstrip())
    return atoms


atomlist = read_mol2_file('1a52_ligand.mol2')
print(atomlist)
for atom in atomlist:
    atomitem = atom.split()
    print(atomitem)

通过pycharm来断点查看,该数据展示了获取到mol2文件的数据。
在这里插入图片描述
接下来,解析到每一行的数据,可以看到 其中的原子里面信息。
在这里插入图片描述

1.3 获取mol2文件有用信息

从上面的信息可以得到一堆原子数据。有了这个信息可以拿到里面xyz的坐标信息,碳的特性,氢的特性等等了
在这里插入图片描述

2.mol2和xyz之间转换

mol2解析完可以拿到对应的数据,这样切换2者之间的方法自然就有了。
mol2的一些文件里面包含了一些苯环结构,这部分结构拿出来后就可以利用编程的方法来计算。

好了,简单的解析读取就完成了你就可以随便玩。下面还顺便带上另外一种在其他地方看到写法。两者也可以用来解析读取mol2文件。

def read_mol2_file(filename):
    atoms = []
    with open(filename, 'r') as f:
        while not f.tell() == os.fstat(f.fileno()).st_size:
            line = f.readline()
            if line.startswith("@<TRIPOS>ATOM"):
                atoms = []
                line = f.readline()
                while not line.startswith("@<TRIPOS>BOND"):
                    atoms.append(line)
                    line = f.readline()
                    if f.tell() == os.fstat(f.fileno()).st_size:
                        atoms.append(line)
                        break
                atoms[-1] = atoms[-1].rstrip()
    return atoms
  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值