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, '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)
有了此思路制作的小工具,可以对日常数据进行实验,清洗,抽取和转换,方便各种格式之间转换。总体思路过程也十分简单。
|