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

2024-09-29 21:56:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个大文件。我想分别在file1和file2的第1列和第2列中找到公共名称。下面的脚本就是这样做的。问题:我还想在输出中打印file1中相应的数据,但它不起作用。如何修复? 文件1.txt

GRMZM5G888627_P01   GO:0003674  molecular_function
GRMZM5G888620_P01   GO:0008150  biological_process
GRMZM5G888625_P03   GO:0008152  metabolic process

文件2.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()

Tags: 文件txtgonewopenprocessfile1list
3条回答

试试这个

 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()

使用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}

内部

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()

而且你只写了一行,所以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()

相关问题 更多 >

    热门问题