1

2 つのファイルがあります。1 つ目はヘッダーとシーケンスを含む fasta ファイルで、2 つ目はヘッダーのみで構成されています。

ファイル_1:

>DF94KKQ1|265|D0M1LACXX|3|2103|4637|10742|1|N|0|TGACCA
TTCCAAAGAAACATGGAAGACCCAGGACTTGGAGGCACCAGGCACCAGCACACAGGGGTA
GGCACATGGCATGGTGTTGGTTGAAGTCTACTTTTCCCACC
>DF94KKQ1|265|D0M1LACXX|3|2103|4565|10742|1|N|0|TGACCA
TTAATTTTTTCAGGCAAGTTTTGTGGATTTCAGTGTGTAAGTCTTTCACCTCTTTGGTTA
AATTTATTCCTATGTATTTTATTCCTTTAGATGCTATTATG
>DF94KKQ1|265|D0M1LACXX|3|2103|4565|10742|2|N|0|TGACCA
TTAATTTTTTCAGGCAAGTTTTGTGGATTTCAGTGTGTAAGTCTTTCACCTCTTTGGTTA
AATTTATTCCTATGTATTTTATTCCTTTAGATGCTATTATG

ファイル_2:

>DF94KKQ1|265|D0M1LACXX|3|2103|4565|10742|2|N|0|TGACCA
>DF94KKQ1|265|D0M1LACXX|3|2103|4668|10746|1|N|0|TGACCA
>DF94KKQ1|265|D0M1LACXX|3|2103|4668|10746|2|N|0|TGACCA
>DF94KKQ1|265|D0M1LACXX|1|2207|10852|3331|2|N|0|TGACCA

File_2 のヘッダーを、7 番目の「|」までまったく同じ文字を持つ File_1 のものと一致させたいと考えています。

File_1 の項目を分割します (ヘッダーの各セクションはリストにインデックス化されます)。「>」で始まる任意の行は、変数に配置されます。

#!/usr/bin/env python
import sys
from Bio import SeqIO

#Function, split header line into a list
def getHeaderInfo(blastLine):
   myFields = blastLine.strip("\n").split("|") 
   HeaderInfo = myFields[:6]
   return HeaderInfo

input_file = sys.argv[1]

#Get input file from the command line
inFileName = sys.argv[1]

#open the input file
inFileHandle = open(inFileName)

#loop over the input file line by line
for thisLine in inFileHandle.readlines():
    if thisLine [0] == '>': 
       print getHeaderInfo(thisLine)
       HeaderInfo = getHeaderInfo(thisLine)

File_2 でこれらの同じインデックスを比較して、次の出力を返すことができる方法を見つけようとしています。

>DF94KKQ1|265|D0M1LACXX|3|2103|4565|10742|1|N|0|TGACCA
TTAATTTTTTCAGGCAAGTTTTGTGGATTTCAGTGTGTAAGTCTTTCACCTCTTTGGTTA
AATTTATTCCTATGTATTTTATTCCTTTAGATGCTATTATG
>DF94KKQ1|265|D0M1LACXX|3|2103|4565|10742|2|N|0|TGACCA
TTAATTTTTTCAGGCAAGTTTTGTGGATTTCAGTGTGTAAGTCTTTCACCTCTTTGGTTA
AATTTATTCCTATGTATTTTATTCCTTTAGATGCTATTATG

私が試した方法のいくつかはインデックスを使用していますが、私のキーは一意ではありません。最初の 6 つの要素をどのように取得してキーにすることができますか、または現在試みている方法よりも優れた方法はありますか? ありがとうございました。

4

2 に答える 2

1

これはあなたが望むことをしますか?

def make_key(line):
    return "|".join(line.split("|", 7)[ : 7]) + "|"

header_set = set()
with open("file_2.txt") as in_f:
    for line in in_f:
        header_set.add(make_key(line))

with open("file_1.txt") as in_f, open("file_3.txt", "w") as out_f:
    accept = False
    for line in in_f:
        if line.startswith(">"):
            key = make_key(line)
            accept = key in header_set

        if accept:
            out_f.write(line)
于 2012-07-16T20:28:12.383 に答える
0

このアプローチには、メモリ マッピング file_1.txt が含まれ、re.finditer を実行して、行をヘッダーでキー付けされた defaultdict にロードします。

import re
import mmap
from collections import defaultdict
pat = re.compile('>.+?(?=(>|$))', re.DOTALL)
with open('file_1.txt') as f:
    map = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)

line_1 = defaultdict(list)
for line in pat.finditer(map):
    fields = line.group().split('|')
    key = '|'.join(fields[:6])
    line_1[key].append(line.group())

map.close()
line_2 = []
with open('file_2.txt') as f:
    for line in f:
      fields = line.split('|')
      key = '|'.join(fields[:6])
      line_2.append(key)

line_2 = set(line_2)
for key in line_2.intersection(line_1.keys()):
    print "".join(line_1[key])
于 2012-07-17T01:05:55.323 に答える