如何在此脚本的for循环中使用for循环?

问题描述:

我正在尝试编写一个脚本,用于创建包含蛋白质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

你在你的内心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