两个文件的相交区域和打印组合结果

时间:2014-05-07 11:12:25

标签: python

我有两个大文件。我想分别在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()

3 个答案:

答案 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']

然后将querysubject设置为列表中的两个项目。然后将它们追加到它上面,给你:

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}