2017-07-18 63 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