在不同的.txt文件中查找公共ID并附加其他相应的行

2024-10-08 19:26:23 发布

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

我试图在两个文件中找到常见的id,并将结果打印到一个新文件中,附加与这些文件对应的附加行身份证怎么办我能做这个吗?你知道吗

输入文件1.txt

F775_23607  EMT15298  GO:0003674    molecular_function PF08268  345
F775_00510  EMT20601  GO:0005515    protein binding    PF08268  456
F775_00510  EMT23774  GO:0003674    molecular_function PF00646  134
F775_00510  EMT23774  GO:0005515    protein binding    PF03106  888
F775_23182  EMT33502  GO:0003677    DNA binding    PF03106  789

输入文件2.txt

contig15    EMT15298  95.27 148
contig18    EMT04099  97.95 293 
contig18    EMT20601  92.83 293 
contig18    EMT23062  93.17 293

所需的输出文件(我希望能够决定哪些行要打印,哪些不打印)

EMT15298  GO:0003674 molecular_function PF08268
EMT20601  GO:0005515 protein binding    PF08268

我的脚本(基本上只打印列,这是常见的)

fileA = open("file1.txt",'r')
fileB = open("file2.txt",'r')
output = open("results.txt",'w')
fileA.next()

setA = set()
for line1 in fileA:
    listA = line1.split('\t')
    setA.add(listA[1])
setB = set()
for line1 in fileB:
    listB = line1.split('\t')
    setB.add(listB[1])
for key in setA & setB:
    output.writelines(key+'\n')

Tags: 文件txtgofunctionopenbindingmolecularprotein
3条回答

由于您的第一个文本文件包含输出的所有“字段”,我们可以稍微减少逻辑和步骤数。你知道吗

首先,我们打开两个输入文件并将它们读入列表:

with open('file1.txt', 'r') as a, open('file2.txt','r') as b:
    fileA = [l.rstrip('\n').split('\t')[1:5] for l in a.readlines()]
    fileB = [l.rstrip('\n').split('\t')[1:] for l in b.readlines()]

现在我们有两个列表,fileAfileB。你会注意到他们两个的切片符号。因为fileA包含了您想要的所有输出值,所以它现在已经准备好了,只需要根据第二个列表进行过滤。我还从两个列表中删除了第一项,因此我们可以使用EMT...值进行比较。你知道吗

现在我们可以检查fileB是否包含(不是全部)fileA,并将匹配项写入结果文件:

with open('results.txt','w') as o:
    for line in fileA:
        if any(line[0] in l for l in fileB):
            o.write('%s\n' % '\t'.join(line))

results.txt再次用相应的匹配项进行制表符分隔:

EMT15298    GO:0003674  molecular_function  PF08268
EMT20601    GO:0005515  protein binding PF08268

如果您只想执行“join”操作,可以使用unix join命令指定第二列,对于制表符分隔的文件,它将类似于:

join file1.txt file2.txt -j2

您需要对行进行排序,否则它将无法工作,但是您也可以使用同样可用的sort命令。你知道吗

此外,要选择要使用的列,可以使用“管道到剖切”功能:

join file1.txt file2.txt -j2 | cut -f2,3,4,5

您可以使用dict而不是set

fileA = open("file1.txt",'r')
fileB = open("file2.txt",'r')
output = open("results.txt",'w')

dictA = dict()
for line1 in fileA:
    listA = line1.split('\t')
    dictA[listA[1]] = listA

dictB = dict()
for line1 in fileB:
    listB = line1.split('\t')
    dictB[listB[1]] = listB

for key in set(dictA).intersection(dictB):
    output.write(dictA[key][1] + '\t' + dictA[key][2] + '\t' + dictA[key][3] + '\t' + dictA[key][4] + '\n')

相关问题 更多 >

    热门问题