我有两个大文件。我想分别在file1和file2的第1列和第2列中找到通用名称。下面的脚本做到了。问题:我想在输出中打印file1中的相应数据,但它不起作用。怎么解决? FILE1.TXT
GRMZM5G888627_P01 GO:0003674 molecular_function
GRMZM5G888620_P01 GO:0008150 biological_process
GRMZM5G888625_P03 GO:0008152 metabolic process
FILE2.TXT
contig1 GRMZM5G888627_P01
contig2 AT2G41790.1
contig3 GRMZM5G888625_P03
期望的输出,
contig1 GRMZM5G888627_P01 GO:0003674 molecular_function
contig3 GRMZM5G888625_P03 GO:0008152 metabolic process
脚本,
f1=open('file1.txt','r')
f2=open('file2.txt','r')
output = open('result.txt','w')
dictA= dict()
for line1 in f1:
listA = line1.rstrip('\n').split('\t')
dictA[listA[0]] = listA
for line1 in f2:
new_list=line1.rstrip('\n').split('\t')
query=new_list[0]
subject=new_list[1]
new_list.append(query)
new_list.append(subject)
if subject in dictA:
output.writelines(query+'\t'+subject+'\t'+str(listA[1])+str(listA[2])+'\n')
output.close()
答案 0 :(得分:2)
在
内for line1 in f2:
listA不会映射到关联的f2行。你把它们存储在dictA中。
一旦您测试主题是否在dictA中,您需要检索正确的listA
for line1 in f2:
new_list=line1.rstrip('\n').split('\t')
query=new_list[0]
subject=new_list[1]
new_list.append(query)
new_list.append(subject)
if subject in dictA:
listA = dictA[subject]
output.writelines(query+'\t'+subject+'\t'+str(listA[1])+str(listA[2])+'\n')
output.close()
我不明白你在这里追加new_list
的原因:
query=new_list[0]
subject=new_list[1]
new_list.append(query)
new_list.append(subject)
处理第一行时,请阅读:
contig1 GRMZM5G888627_P01
进入new_list
,基本上为您提供:
new_list == ['contig1', 'GRMZM5G888627_P01']
然后将query
和subject
设置为列表中的两个项目。然后将它们追加到它上面,给你:
new_list == ['contig1', 'GRMZM5G888627_P01', 'contig1', 'GRMZM5G888627_P01']
你永远不会使用的。你应该能够:
for line1 in f2:
new_list=line1.rstrip('\n').split('\t')
subject=new_list[1]
if subject in dictA:
listA = dictA[subject]
output.writelines(new_list[0] + '\t' + subject + '\t' + str(listA[1]) + str(listA[2]) + '\n')
output.close()
你也只写了1行,所以output.write
没问题。字符串添加通常很糟糕,因此替换为格式。您的listA
存储了字符串,因此我取消了str()
来电。
for line1 in f2:
new_list=line1.rstrip('\n').split('\t')
subject=new_list[1]
if subject in dictA:
listA = dictA[subject]
output.write("{}\t{}\t{}{}\n".format(new_list[0], subject, listA[1], listA[2])
output.close()
答案 1 :(得分:1)
试试这个,
ins = open('file1.txt', "r" )
values=''
dict={}
for line in ins:
arrayline=line.split()
dict[arrayline[0]]='\t'.join(arrayline)
file2=open('file2.txt', "r" )
output = open('result.txt','w')
for line in file2:
array2=line.split()
try:
v=dict[array2[1]]
output.write('\n'+array2[0]+'\t'+v)
except:
pass
output.close()
答案 2 :(得分:0)
使用sets
In [1]: list1=[1,2,3,4,5,6,7,8,9]
In [2]: list2=[1,2,3,10,11,12,13]
In [3]: list1=set(list1)
In [4]: list1.intersection(list2)
Out[4]: {1, 2, 3}