我有两个这样的文件, 蛋白质列表 -
TRIUR3_05947-P1
TRIUR3_06394-P1
Traes_1BL_EB95F4919.2
和制表符分隔的重叠群和蛋白质的字典 -
contig22 TRIUR3_05947-P1
contig15 TRIUR3_05947-P1
contig1 Traes_1BL_EB95F4919.2
contig67 Traes_1BL_EB95F4919.2
contig98 Traes_1BL_EB95F4919.2
contig45 MLOC_71599.4
我想要的输出是找到所有常见的蛋白质并打印出这样的结果,
contig22 TRIUR3_05947-P1
contig15 TRIUR3_05947-P1
contig1 Traes_1BL_EB95F4919.2
contig67 Traes_1BL_EB95F4919.2
contig98 Traes_1BL_EB95F4919.2
这是我的下面的脚本,但是它给了我普通键的结果,我猜是压倒一切,怎么能解决?
f1=open('mydict.txt','r')
f2=open('mylist.txt','r')
output = open('result.txt','w')
dictA= dict()
for line1 in f1:
listA = line1.rstrip('\r\n').split('\t')
dictA[listA[1]] = listA[0]
for line1 in f2:
new_list=line1.rstrip('\n').split()
query=new_list[0]
if query in dictA:
listA[0] = dictA[query]
output.write(query+'\t'+str(listA[0])+'\n')
答案 0 :(得分:1)
在你的第一个for循环中,当你将txt文件转换为python字典时,你会丢失信息:
for ...:
dictA[listA[1]] = listA[0]
例如,如果你有行
contig1 Traes_1BL_EB95F4919.2
contig67 Traes_1BL_EB95F4919.2
contig98 Traes_1BL_EB95F4919.2
在你的txt文件中,生成的字典只有最后一个条目的键值对,反转。
要实现目标,只需对程序进行少量修改,请尝试
from collections import defaultdict
f1=open('mydict.txt','r')
f2=open('mylist.txt','r')
output = open('result.txt','w')
dictA= defaultdict(list)
for line1 in f1:
listA = line1.rstrip('\r\n').split('\t')
dictA[listA[1]].append(listA[0]) # Save all the common proteins
for line1 in f2:
new_list=line1.rstrip('\n').split()
query=new_list[0]
if query in dictA:
listA = dictA[query] # Now have a list of matching contigs
for contig in listA:
output.write(contig + '\t' + query +'\n')
答案 1 :(得分:1)
你做错了。如果将“词典文件”存储在字典结构中,使用蛋白质名称作为键,则会丢失信息。
更好的方法是首先阅读蛋白质列表,并将所有蛋白质名称存储在一组中。然后,您阅读字典文件并打印蛋白质名称在集合中的所有行。
with open('mylist.txt') as mylist:
proteins = set(line.strip() for line in mylist)
with open('mydict.txt') as mydict, open('result.txt', 'w') as output:
for line in mydict:
_, protein = line.strip().split()
if protein in proteins:
output.write(line)