2017-07-18 236 views
0

我正在使用蛋白质数据库中的文件,它看起来像这样。使用python比较文件中不同行的两个单词

SITE  2 AC1 15 ASN A 306 LEU A 309 ILE A 310 PHE A 313      
SITE  3 AC1 15 ARG A 316 LEU A 326 ALA A 327 ILE A 345      
SITE  4 AC1 15 CYS A 432 HIS A 435 HOH A 504        
CRYST1 64.511 64.511 111.465 90.00 90.00 90.00 P 43 21 2  8   
ORIGX1  1.000000 0.000000 0.000000  0.00000       
ORIGX2  0.000000 1.000000 0.000000  0.00000       
ORIGX3  0.000000 0.000000 1.000000  0.00000       
SCALE1  0.015501 0.000000 0.000000  0.00000       
SCALE2  0.000000 0.015501 0.000000  0.00000       
SCALE3  0.000000 0.000000 0.008971  0.00000       
ATOM  1 N ASP A 229  29.461 51.231 44.569 1.00 47.64   N 
ATOM  2 CA ASP A 229  29.341 51.990 43.290 1.00 47.13   C 
ATOM  3 C ASP A 229  30.455 51.566 42.330 1.00 45.62   C 
ATOM  4 O ASP A 229  31.598 51.376 42.743 1.00 47.18   O 
ATOM  5 CB ASP A 229  29.433 53.493 43.567 1.00 49.27   C 
ATOM  6 CG ASP A 229  28.817 54.329 42.463 1.00 51.26   C 
ATOM  7 OD1 ASP A 229  27.603 54.172 42.206 1.00 53.47   O 
ATOM  8 OD2 ASP A 229  29.542 55.145 41.856 1.00 52.96   O 
ATOM  9 N MET A 230  30.119 51.424 41.051 1.00 41.99   N 
ATOM  10 CA MET A 230  31.092 51.004 40.043 1.00 36.38   C 

首先,我需要仅提取标记ATOM行的第四列,其是氨基酸序列,其特异性原子是的一部分。我在这里完成了。

import gzip 
class Manual_Seq: 

    def parseSeq(self, path): 
     with gzip.open(path,'r') as file_content: 
      for line in file_content: 
       newLine = line.split(' ')[0] 
       if newLine == 'ATOM': 
        AA = line[17]+line[18]+line[19] 
        print AA 

其产生这种

ASP 
ASP 
ASP 
..... 
MET 

但我现在需要的输出,是只输出第一ASP和第一次见面和等,并将它们连接起来所以它会是这样的。

ASPMET 

我想也许我会尽力重复先行线,直到它从第一输出不同的比较,但我不确定我会怎么做,如果你有任何其他想法或我的代码的任何改进,请随时提交您的建议,谢谢。 我还需要一提的是有其实可以在一个文件中两个相同的氨基酸,所以输出可以是“ASP MET ASP”

+0

只是为了澄清列表中的字符串:你为什么第一个'MET'配对第一个'ASP'?是用第三列中的匹配值做什么?即您是否根据第3列中的条目配对第4列值? – DatHydroGuy

+0

@DatHydroGuy这是为了打印出相关蛋白质的序列。正如你所看到的,第三列是原子的名字,第四列是原子所属的序列。而一系列的ASP将始终具有这些特定顺序的原子。所以这意味着ASP是该链序列中的第一个氨基酸,所以它会像ASPMET ...(一些其他氨基酸)。而且由于ASP总是有这8个原子的顺序,所以我们不需要打印ASP * 8,而是暗示它。 – GokuBabs

回答

0

代替它们打印出来的,做一个列表,因此

print AA 

成为

my_list.append(AA) 

只是不要忘了my_list=[]

循环之前初始化列表现在,你拥有所有这些值,你可以遍历它们并从唯一值中创建一个字符串。如果订单不要紧,你比你可以使用set这样的:

my_string = ''.join(set(my_list)) 

但是,如果顺序很重要,您可以通过该列表必须循环:

my_string = '' 
seen = [] 
for item in my_list: 
    if item not in seen: 
     seen.append(item) 
     my_string += item 

你可以做到这一点没有seen列表,但这将是有风险的

无论如何,这意味着你正在循环两次相同的数据,这是不需要的。相反,所有这一切,你可以在你的主循环之前初始化my_string=''seen=[],做什么,我做你的循环,而不是print AA的内心深处,应该是这样的:

def parseSeq(self, path): 
    with gzip.open(path,'r') as file_content: 
     my_string = '' 
     seen = [] 
     for line in file_content: 
      newLine = line.split(' ')[0] 
      if newLine == 'ATOM': 
       AA = line[17]+line[18]+line[19] 
       if AA not in seen: 
        seen.append(AA) 
        my_string += AA 
     return my_string # or print my_string 
0
with gzip.open(path,'r') as file_content: 
     values_set = set() 
     for line in file_content: 
      newLine = line.split(' ')[0] 
      if newLine == 'ATOM': 
       AA = line[17]+line[18]+line[19] 
       print AA 
       values_set.add(AA) 
     print ''.join(values_set) 

尝试

+1

订单不能保证。 –

0

首先,你不需要樱桃从字符串中挑选字符。您可以使用str.split()获取每行的字符串列表。

你可以做的是维护一个列表和一组序列。该集合用于高效查找,并且该列表按顺序存储符号。

seq_list = [] 
seq_set = {} 

for line in file_content: 
    items = line.split() 
    if items[0] == 'ATOM': 
     AA = items[3] 
     if AA not in seq_set: 
      seq_list.append(AA) 
      seq_set.add(AA) 

外循环,你可能只是加入列表的项目是这样的:

print(''.join(seq_list)) 

我保留了序列的名单内,所以你必须为每个序列细粒度访问/控制,如果你想要做的不仅仅是将它们打印出来。

0

我加入一些代码到你的现有代码:

import gzip 
class Manual_Seq: 

def parseSeq(self, path): 
    with gzip.open(path,'r') as file_content: 

这里我们定义了一个空的列表,称为AA电池来保存你的氨基酸。

 AAs = [] 
     for line in file_content: 

接下来,我概括你的代码位的线分成领域,使我们可以提取各种领域,如需要。

  fields = line.split(' ') 
      line_index = fields[0] 
      if line_index == 'ATOM': 

他,我们检查,看看是否氨基酸已经在氨基酸的列表...如果不是,那么我们的氨基酸添加到列表中。这具有重复数据删除氨基酸的效果酸。

   if fields[3] not in AAs: 
        AAs.append(fields[3]) 

最后,我们串接所有的值到使用空字符串''join()方法单一值。

return ''.join(AAs)    
+0

对不起,我没有足够具体,我忘记提及两个相同的氨基酸可能在同一个文件中,因此一个可能的输出可能是“ASP MET MET MET”。像ASP这样的氨基酸总是有8行,之后是另一种氨基酸。 – GokuBabs

0

想知道您是否考虑过使用此BioPandas?

https://rasbt.github.io/biopandas/tutorials/Working_with_PDB_Structures_in_DataFrames/

它应该是你想用大熊猫做什么容易做。 你只需要使用:

df.column_name.unique() 

,然后concantenate使用"".join(list_name) https://docs.python.org/3/library/stdtypes.html#str.join

+0

其实我使用的是BioPython,但由于有很多PDB文件没有在头文件中指定序列,我必须为每个链手动提取它们。但是,如果这么简单,我会考虑BioPandas,谢谢! – GokuBabs