0

各行に一意の ID 番号を持つファイルがあります。これらの ID 番号の出現を別のファイルで検索し、これらの ID 番号が 2 番目のファイル (この場合は出力ファイル) にある行を返そうとしています。私はプログラミングが初めてで、これが私がこれまでに持っているものです。

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

読み取り ID は、 READ ...の後に一部の ID と一致しますが、すべての ID と一致するわけではありません。

4

3 に答える 3

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)
于 2013-02-18T22:12:49.043 に答える
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リストを出力ファイルに出力できます。

于 2013-02-18T22:21:39.530 に答える
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^2) ではなく、O(n) ソリューションのメモリ オーバーヘッドと交換しています。

正規表現を使用して ID と go 番号を抽出していますが、桁数が変わると脆くなります。

于 2013-02-18T22:11:48.213 に答える