mol2里面有一些日常用到原子信息,这些信息在日常实验过程,会有快速转换列表的需求。下面,我们看看这个怎么转换。首先我们抽出一段截取的文件信息。通过如下代码将每一行进行列表展示。
mol2str = '''1 C1 13.8060 37.7840 36.1770 C.2 1 DHY 0.0445 2 C2 13.5920 36.3210 35.7700 C.3 1 DHY 0.0261 3 C1' 12.4160 35.9970 34.8980 C.ar 1 DHY -0.0497 4 C2' 12.3640 36.6850 33.6940 C.ar 1 DHY -0.0384 5 C3' 11.3370 36.4780 32.8090 C.ar 1 DHY 0.1101 6 O3' 11.0820 37.0600 31.5790 O.3 1 DHY -0.3385 7 C4' 10.3460 35.5510 33.1180 C.ar 1 DHY 0.1090 8 O4' 9.4350 35.4550 32.0850 O.3 1 DHY -0.3413 9 C5' 10.3720 34.8500 34.3070 C.ar 1 DHY -0.0479 10 C6' 11.4240 35.0560 35.2000 C.ar 1 DHY -0.0784 11 O1 14.4450 38.0110 37.1970 O.co2 1 DHY -0.5667 12 O2 13.2690 38.7890 35.7080 O.co2 1 DHY -0.5667 13 H1 13.4835 35.7366 36.6956 H 1 DHY 0.0566 14 H2 14.4958 35.9951 35.2344 H 1 DHY 0.0566 15 H3 13.1455 37.3954 33.4498 H 1 DHY 0.0453 16 H4 11.0657 36.3870 30.9088 H 1 DHY 0.2442 17 H5 9.6743 36.0633 31.3957 H 1 DHY 0.2420 18 H6 9.5825 34.1462 34.5446 H 1 DHY 0.0493 19 H7 11.4732 34.4902 36.1233 H 1 DHY 0.0439''' def mo2list(txt, filter=''): list = txt.split("n") result = '' for line in list: listItem = line.split() if filter != '': filter_list = filter.split(',') result += "[" + ",".join(listItem[int(i)] for i in filter_list) + "],n" else: result += "[" + ",".join(listItem) + "],n" print(result) if __name__ == '__main__': mo2list(mol2str)
转换出来是一个列表存储结构。
代码过程理解为对这个元素采取分步处理,添加对应的逗号过程。但是发现如果我们只是需要其中某项则可以采取过滤方法。获取我们需要关键部分信息。如下代码。
if __name__ == '__main__': # mo2list(mol2str) mo2list(mol2str, '1,2,3,4')
在上述操作中,有了这个思路,我们可以在项目过程实现了一个QT交互操作实现这个过程。在可视化操作基础上,利用上述操作过程,达到快速转换Mol2文件里面数据的目的。
如下关键代码。
from PyQt5.QtWidgets import (QWidget, QPushButton, QLineEdit, QHBoxLayout, QTextEdit, QVBoxLayout) class ListConver(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): # 数据快速转换列表 self.vLayout = QVBoxLayout(self) self.vLayout.setContentsMargins(10, 10, 10, 10) hbox = QWidget() self.vLayout.addWidget(hbox) self.horizontalLayout = QHBoxLayout(hbox) self.horizontalLayout.setSpacing(6) self.textEdit = QTextEdit(hbox) self.horizontalLayout.addWidget(self.textEdit) self.textEdit_2 = QTextEdit(hbox) self.horizontalLayout.addWidget(self.textEdit_2) self.output = QLineEdit() self.output.setPlaceholderText('输入需要过滤列表序列,如 0,1,2按逗号进行分隔') self.vLayout.addWidget(self.output) self.pushButton = QPushButton('转换') self.pushButton.resize(80, 20) self.pushButton.clicked.connect(self.onChane) self.pushButton.setStyleSheet(''' QPushButton {text-align : center; color: #fff; background-color: #354052; border:none; padding: 6px; height:30px; line-height:44px; font : 12px;} ''') self.vLayout.addWidget(self.pushButton) def onChane(self, e): txt = self.textEdit.toPlainText() if txt != "": filter = self.output.text() list = txt.split("n") result = '' for line in list: listItem = line.split() if filter != '': filter_list = filter.split(',') result += "[" + ",".join(listItem[int(i)] for i in filter_list) + "],n" else: result += "[" + ",".join(listItem) + "],n" self.textEdit_2.setText(result)
有了此思路制作的小工具,可以对日常数据进行实验,清洗,抽取和转换,方便各种格式之间转换。总体思路过程也十分简单。