0

我正在尝试编写一个脚本,该脚本从包含蛋白质 ID 的文件中创建字典列表。这是我写到现在的:

#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
4

1 回答 1

0

您减少n内部for循环,但不要将其重置为原始值。只需在循环n = len(column_count)之前或之后添加,它应该可以工作。for w in range(n):或者更好的是,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,因此除非这是某种标题行,否则某些 ID 将丢失。更新:一个标题,列出了所有的列,所以这完全没问题。

最后,您应该注意关闭文件(file.close()在方法末尾添加),或使用with语句,它将为您处理此问题。在此块结束时,文件将自动正确关闭。

with open(map_file) as f:
    # your code
于 2013-10-02T10:52:25.770 回答