我正在尝试编写一个脚本,从包含蛋白质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发布于 2013-10-02 10:52:25
您可以在内部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循环中不会再次读取该行,因此除非这是某种类型的标头行,否则某些is将丢失。更新:是一个标头,列出了所有的列,所以这是完全没有问题的。
最后,您应该负责关闭文件(在方法的末尾添加file.close() ),或者使用 statement,它将为您处理这个问题。在此块的末尾,文件将自动正确关闭。
with open(map_file) as f:
# your codehttps://stackoverflow.com/questions/19134432
复制相似问题