我们有一下文本:dssp1a45.dssp
要求提取出文本中氨基酸序列的名称和结构,并是他们整行相互对应,其中结构序列中的空格 用'_'代替。
输出格式为两行信息:GKITFYEDRGFQGRHYECSSDHSNLQPYFSRCNSIRVDSGCWMLYEQPNFQGPQYF...
_EEEEEEETTTEEEEEEE_S_BS__TTT_S__SEEEEEESEEEEESSGGG...
拿到文本文件.dssp(类似于.txt)
我们发现我们的目的信息在文本文件中的红色区域的蓝色框中,其余信息全部都是不需要的,我们要把其余区域清除掉,提取出这两列信息,并且对应输出,这便是思路!
第一步:
file = open('dssp1a45.dssp','r') #以读取方式打开文件 str = ''.join(file.readlines()[28:]) # 删除检索内容以外的首部 file2 = open('new.txt','w') #将删除后的文件写入new.txt file2.write(str) f = open("new.txt",'r')
我们这时候把红色区域上面的多余部分就排除掉了。
其中file.readlines()[28:]表示读取文件28行以下的内容 即为红色区域。
str=''.join() 表示把括号内的列表强制转换成字符串str,并且元素间不加任何分隔符。
之后再创建一个file2:new.txt。
将str写入new.txt.并用接收可读来打开他
第二步:
我们得到的new.txt文件如下,自动保存在我们的相同目录内。
一会儿用完再删除,卸磨杀驴!
所以接下来我们提取这里面的三/四两列信息出来就欧克了
注意这个是字符串文本,表面上看是3/4两列,其实不是,中间有空格,好好数数应该是第14列和第17列,迭代提取出来!
a = f.readlines() #对文本f进行列表迭代 acid = 13 stucture = 16 #找到氨基酸和结构所在列数 aa ="" #预定义两个空字符串空间来存放氨基酸序列和结构序列 stc="" i = 0 for line in a: #迭代每个行列表,并提取氨基酸和结构所对应的列元素 aa += a[i][acid] stc += a[i][stucture] for b in stc: # 迭代结构序列 new_name = stc.replace(" ", '_') # 将结构序列中的空格改成下划线 i+=1 final = aa+ '\n' +new_name #计算结果 print(final) #打印结果
注释非常明确。
值得注意的是,其实在python中处理字符串就相当于是在C中对数组进行处理,这里面类似二维数组的一个处理方式我们的a[i]表示的是每一整行。
a[i][j]表示的是第i行第j个元素,通过数元素我们发现氨基酸和对应结构的j的值是14和17,
对应的j应该是13和16,
所以我们迭代出每行的氨基酸和对应结构就很容易了。
然后我们把读取到的氨基酸和结构序列分别存放到一个空的字符串aa和stc里面。
修改空格成为'_' :我们引入了第二个for循环,目的是把stc里面读到的空格修改,所以对stc进行迭代,用replace函数进行修改以后,将新的修改好的字符串存入new_name字符串中,所以我们最后的修改好的结构序列和氨基酸序列进行final的运算(如代码框内所示),就可以得到如下结果了:
第三步:
收尾工作要做好
file3=open('dssp1a45.ss','w') file3.write(final) #将最后的结果写入file3并保存为dssp1a45.ss file3.close() #注意关闭使用过的所有文件! f.close() file2.close() file.close() #import os 调用os # os.remove('new.txt') #所有文件关闭后,删除辅助操作用的文件
我们可以把我们得到的结果这样写入一个文件中,最后关闭掉我们中途使用过的文件,并且把过度文件new.txt删除,我们的目录就会非常干净了!