2013-10-02 156 views
0

我正在嘗試編寫一個腳本,用於創建包含蛋白質ID的文件的字典列表。 這是我寫的到現在爲止:如何在此腳本的for循環中使用for循環?

#import packages 
import sys 

#get the file from the command line 
map_file = sys.argv[1] 


#create dictionaries containing the different proteins IDs 
def get_mapping(map_file): 
     file = open(map_file) 
    result = list() 
    column_count = file.readline().split('\t') 
    n = len(column_count) 
    for i in range(n-1): 
     result.append({}) 
    for line in file: 
     word = line.split('\t') 
     for w in range(n): 
      if word[n-1] <> word[0]: 
       result[n-2][word[n-1]] = word[0] 
      n = n-1   
    return result 

print get_mapping(map_file) 

所以輸入文件包含許多行每一行都包含特定蛋白質2-4個不同的ID。我想創建一個字典列表,其中第一個ID爲行的值爲其中一個ID爲鍵。 當我運行這個腳本它正是我想要它做的,但只爲輸入文件的第一行。我需要更改什麼,以便它可以對輸入文件中的每一行執行此操作?

的蛋白質文件是這樣的:

Ensembl_Protein_ID UniProt/SwissProt_Accession UniProt/TrEMBL_Accession RGD_ID 
ENSRNOP00000000008 P18088 C9E895 2652 
ENSRNOP00000000008 P18088 B3VQJ0 2652 
ENSRNOP00000000009 D3ZEM1 1310201 
ENSRNOP00000000025 B4F7C7 
ENSRNOP00000000029 Q9ES39 620038 
ENSRNOP00000000037 Q7TQM3 735156 
ENSRNOP00000000052 O70352 Q6IN14 69070 
ENSRNOP00000000053 Q9JLM2 68400 
ENSRNOP00000000064 P97874 621589 
ENSRNOP00000000072 P29419 621377 
ENSRNOP00000000074 B2RZ28 1304584 
ENSRNOP00000000078 D3ZDI7 1308022 
ENSRNOP00000000080 Q5XI68 1305201 
ENSRNOP00000000085 D3ZDH7 
+0

Ensembl_Protein_ID \t的UniProt/SwissProt_Accession \t的UniProt/TrEMBL_Accession \t RGD_ID ENSRNOP00000000008 \t \t P18088 C9E895 ENSRNOP00000000008 \t \t P18088 B3VQJ0 ENSRNOP00000000009 \t \t \t D3ZEM1 1310201 ENSRNOP00000000025 \t \t \t B4F7C7 ENSRNOP00000000029 \t Q9ES39 \t ENSRNOP00000000037 \t \t Q7TQM3 ENSRNOP00000000052 \t \t O70352 Q6IN14 ENSRNOP00000000053 \t \t Q9JLM2 ENSRNOP00000000064 \t \t P97874 621589 \t ENSRNOP00000000072 \t \t P29419 621377 \t ENSRNOP00000000074 \t \t \t B2RZ28 1304584 ENSRNOP00000000078 \t \t D3ZDI7 ENSRNOP00000000080 \t Q5XI68 \t ENSRNOP00000000085 \t \t D3ZDH7 – user2838069

+0

根本不是,乾杯! – user2838069

回答

0

你在你的內心for循環decrese n但不復位到它的原始值。只需在for w in range(n):循環之前或之後添加n = len(column_count),它應該可以工作。甚至更好,直接使用w變量,而不是減少n

for w in range(1, len(word)): 
    if word[w] <> word[0]: 
     result[w-1][word[w]] = word[0] 

另外,還要注意column_count = file.readline().split('\t')可能是一個問題:首先,從你的問題來看,目前尚不清楚第一行是否將持有的最大每行字數;第二,請注意,這條線將而不是在您的第二個for line in file循環中再次讀取,因此除非這是某種標題行,否則一些標識將會丟失。 更新:一個標題,列出所有的列,所以這是完全沒問題。

最後,您應該注意關閉文件(在方法結尾添加file.close()),或者使用with statement,這將爲您處理此問題。在該塊的末尾,該文件將自動正確關閉。

with open(map_file) as f: 
    # your code 
+0

您好, 感謝您的幫助,此作品! 我試圖在評論中添加輸入文件的一部分,但它無法讓它看起來像它應該。第一行是一個標題,表示它下面的列中存在哪種類型的ID。我不希望它在字典中的信息。所以我認爲file.readline()。split('\ t')正是我想要的。 我不太確定爲什麼我應該使用with語句以及它的作用。你能再解釋一下嗎? – user2838069