用另一个文件的内容在文件中搜索 python

0 投票
3 回答
2570 浏览
提问于 2025-04-17 16:18

我有一个文件,每一行都有一个独特的ID号码。我想在另一个文件中查找这些ID号码出现的地方,并把这些ID号码所在的行返回到一个输出文件里。因为我刚开始学习编程,所以现在的进展就是这样。

outlist = []
with open('readID.txt', 'r') as readID, \
     open('GOlines.txt', 'w') as output, \
     open('GO.txt', 'r') as GO:  
     x = readID.readlines()
     print x
     for line in GO:
        if x[1:-1] in line:
        outlist.append(line)
        outlist.append('\n')

     if x[1:-1] in line:
        outlist.append(line)
        outlist.append('\n')
     print outlist
     output.writelines(outlist)

这些文件的格式是这样的:readID.txt

00073810.1
00082422.1
00018647.1
00063072.1

GO.txt

#query  GO  reference DB    reference family    
HumanDistalGut_READ_00048904.2  GO:0006412  TIGRFAM TIGR00001    
HumanDistalGut_READ_00043244.3  GO:0022625  TIGRFAM TIGR00001    
HumanDistalGut_READ_00048644.4  GO:0000315  TIGRFAM TIGR00001   
HumanDistalGut_READ_00067264.5  GO:0003735  TIGRFAM TIGR00001

readID.txt中的ID和GO.txt中以READ开头的某些ID是匹配的,但并不是全部。

3 个回答

0

如果你的文件小到可以放进你的内存里。

with open('/somepath/GO.txt') as f:
    pool = f.readlines()

with open('/somepath/readID.txt') as f:    
    tokens = f.readlines()

# strip spaces/new lines
tokens = [t.strip() for t in tokens]
found = [(t, lno) for t in tokens for (lno, l) in enumerate(pool) if t in l]

那么你可以把你的 found 列表打印到你的输出文件里。

0

也许可以像这样:

with open('readID.txt', 'r') as readID, open('GOlines.txt', 'w') as output, open('GO.txt', 'r') as GO:
    for ID in readID:
        for line in GO:
            if ID in line:
                output.write(line)
0
#!/usr/bin/env python
# encoding: utf-8

import sys
import re

def extract_id(line):
    """
    input: HumanDistalGut_READ_00048904.2  GO:0006412  TIGRFAM TIGR00001
    returns: 00048904.2
    """
    result = re.search(r'READ_(\d{8}\.\d)', line)
    if result != None:
        return result.group(1)
    else:
        return None

def extract_go_num(line):
    """
    input: HumanDistalGut_READ_00048904.2  GO:0006412  TIGRFAM TIGR00001
    returns: 0006412
    """
    result = re.search(r'GO:(\d{7})', line)
    if result != None:
        return result.group(1)
    else:
        return None

def main(argv = None):
    if argv is None:
        argv = sys.argv

    with open('readID.txt', 'r') as f:
        ids = frozenset(f.readlines())

    with open('GO.txt', 'r') as haystack, \
        open('GOLines.txt', 'w') as output:

        for line in haystack:
            if extract_id(line) in ids:
                output.write(extract_go_num(line) + '\n')

if __name__ == "__main__":
    sys.exit(main())

我在用更多的内存换取一个O(n)的解决方案,而不是O(n^2)的。

我正在用正则表达式来提取id和数字,但如果数字的位数发生变化,这种方法就不太可靠了。

撰写回答