2013-11-21 69 views
1

我是一個開始的python用戶(試圖學習生物信息學),並且我很難讓我的最終'for循環'正確。我使用了一個基於網絡的生物信息學程序來評估某些蛋白質(蛋白名稱和序列包含在ORF內)的亞細胞定位,我試圖解析結果(包含在targetp內)。我使用的基於網絡的程序截斷了蛋白質的名稱(並且不包括序列),並且我想解析我的結果文件,以便我具有FASTA格式中每種蛋白質的完整名稱和序列(this需要在一行上具有「>」+蛋白質名稱,並且在後續行上具有蛋白質序列)。我認爲一切都進展順利,直到最後一塊代碼;我最終得到了適當的蛋白質名稱,但它們都被添加到相同的序列中。我知道必須有一些簡單的事情,我做錯了,但我無法弄清楚。有任何想法嗎?Python'for loop'來解析結果

謝謝!

的ORF的文件如下所示(它是FASTA,但 「不應該存在,只有>):

」> HsaNP_000700支鏈酮酸脫氫酶E1,α多肽 MAVAIAAARVWRLNRGLSQAALLLLRQPGARGLARSHPPRQQQQFSSLDDKPQFPGASAEFIDKLEFIQPNVISGIPIYRVMDRQGQIINPSEDPHLPKEKVLKLYKSMTLLNTMDRILYESQRQGRISFYMTNYGEEGTHVGSAAALDNTDLVFGQYREAGVLMYRDYPLELFMAQCYGNISDLGKGRQMPVHYGCKERHFVTISSPLATQIPQAVGAAYAAKRANANRVVICYFGEGAASEGDAHAGFNFAATLECPIIFFCRNNGYAISTPTSEQYRGDGIAARGPGYGIMSIRVDGNDVFAVYNATKEARRRAVAENQPFLIEAMTYRIGHHSTSDDSSAYRSVDEVNYWDKQDHPISRLRHYLLSQGWWDEEQEKAWRKQSRRKVMEAFEQAERKPKPNPNLLFSDVYQEMPAQLRKQQESLARHLQTYGEHYPLDHFDK

「> HsaNP_060914丙酮酸脫氫酶磷酸酶前體 MPAPTQLFFPLIRNCELSRIYGTACYCHHKHLCCSSSYIPQSRLRYTPHPAYATFCRPKENWWQYTQGRRYASTPQKFYLTPPQVNSILKANEYSFKVPEFDGKNVSSILGFDSNQLPANAPIEDRRSAATCLQTRGMLLGVFDGHAGCACSQAVSERLFYYIAVSLLPHETLLEIENAVESGRALLPILQWHKHPNDYFSKEASKLYFNSLRTYWQELIDLNTGESTDIDVKEALINAFKRLDNDISLEAQVGDPNSFLNYLVLRVAFSGATACVAHVDGVDLHVANTGDSRAMLGVQEEDGSWSAVTLSNDHNAQNERELERLKLEHPKSEAKSVVKQDRLLGLLMPFRAFGDVKFKWSIDLQKRVIESGPDQLNDNEYTKFIPPNYHTPPYLTAEPEVTYHRLRPQDKFLVLATDGLWETMHRQDVVRIVGEYLTGMHHQQPIAVGGYKVTLGQMHGLLTERRTKMSSVFEDQNAATHLIRHAVGNNEFGTVDHERLSKMLSLPEELARMYRDDITIIVVQFNSHVVGAYQNQE

的targetp文件看起來像這樣(在M​​爲在位置57,但這裏的格式將引發此關閉):

HsaNP_000700 445 0。 939 0.020 0.089 M 1
HsaNP_060914 537 0.309 0.073 0.629 _ 4

在targetp最左邊的列是標識符(在上面每一個蛋白質序列的標題行的一部分),並且我想與一個「M僅返回條目'(即不是'_')在位置57以及來自ORF(標題行)的蛋白質名稱。

我的腳本是:

#!/usr/bin/python 

ORFs = open('Human.MitoCarta.fasta', 'U') 
targetp = open('MitoCarta_TargetP_combined.out', 'U') 
report = targetp.readlines() 
protfile = open('mitocarta_no_mTP.fasta','w') 
protid = [] 
seqdict = {} 

for seq in ORFs: 
    seq = seq.rstrip() 
    if seq[0] == '': 
     continue 
    if seq[0] == '>': 
     name = seq[1:] 
     seqdict[name] = '' 
     continue 

    seqdict[name] += seq 

for entry in report: 
    if entry.startswith('HsaNP'): 
     if entry[57] != 'M': 
      protid.append(entry[0:20]) 
      protid = [x.strip(' ') for x in protid] 


nameslist = seqdict.keys() 
c = 0 
for i in protid: 
    if i in nameslist[c]: 
     protfile.write('>%s\n%s\n\n' % (nameslist[c], seqdict[name])) 
     c += 1 

protfile.close() 

回答

1

是的,你寫nameslist [C]和seqdict [名],但你永遠不會改變 '名稱'。所以如果你想得到不同的序列,你需要改變'name'。你應該寫:

​​

這樣,你應該得到它的權利。

+0

感謝您的幫助。您的修復程序讓我輸出,但不幸的是,我仍然沒有得到正確的輸出(顯然是我的錯誤)。在我的腳本中,所有protid名稱應該位於名稱列表名稱中(每個名稱的子集,因爲protid名稱是截斷的名稱列表名稱),但許多名稱列表名稱不在protid中。當我運行我的腳本時,我得到的輸出包括不在protid中但名稱列表中的名稱/序列。你有什麼想法,爲什麼這可能是? – mitochondrion

+0

是的,縮進protfile.write bla bla bla以便它在if條件中。否則,即使它不符合if語句,它也會爲我運行。 – JGallo

+0

再次感謝。我曾試過這種方法,但我的輸出只有3個序列,而應該是> 700。因此,即使所有protid名稱都是從名稱列表中的名稱派生的,我也只有3個滿足條件的protid名稱。有什麼我做錯了,這是顯而易見的?有沒有什麼方法可以顯示我正在處理的文件,以便更好地解決問題?對不起,所有的問題 - 我不擅長這個呢! – mitochondrion