2012-07-16 3 views
1

두 파일이 있습니다. 첫 번째 파일은 헤더와 시퀀스가있는 fasta 파일이고 두 번째 파일은 헤더만으로 구성됩니다.fasta 파일에서 파이썬과 일치하는 헤더

File_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 

File_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 

I가 7까지 똑같은 문자가 File_1에 아무것도 File_2의 헤더를 일치시킬 '|'.

파일 1의 항목을 분할했습니다 (헤더의 각 섹션은 목록으로 색인 됨). 는 '>'로 시작 애니 라인 변수에 배치됩니다 :

>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 
: 나는 다음과 같은 출력을 반환 File_2에서이 같은 인덱스를 비교할 수있는 방법을 찾기 위해 노력 해왔다

#!/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) 

여러 가지 방법 중 인덱스를 사용해 보았지만 키가 고유하지 않습니다. 어떻게하면 처음 6 개의 요소를 가져와 내 열쇠로 만들 수 있습니까? 아니면 현재 시도하고있는 것보다 나은 방법이 있습니까? 고맙습니다.

+0

헤더 라인을 라인을로드 그것을 통해 re.finditer 실행, 메모리 매핑 file_1.txt을 포함 , 그들은 게시물에 나타나지 않았다 – user1529819

답변

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

이 방법은 '>'로 시작 File_1 및 File_2에서 헤더 키드 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]) 
+0

고맙습니다. 두 파일을 모두 파싱하는 방법을 알아 냈습니다. 헤더와 시퀀스로 전체 fasta 레코드를 반환하는 것은 다음 번에 끊는 것입니다. 곧 코드를 게시 할 예정입니다. – user1529819

+0

@ user1529819 - 위의 regex 솔루션은 헤더와 시퀀스를 반환합니다. 내가 뭔가를 놓치지 않으면 실제로 – iruvar

+0

grep이 훨씬 빠르고 쉽게 작동합니다. 문제는 파일 1이 방대하고 메모리로 읽어 들일 수 없다는 것입니다. grep을 사용하면 쿼리 파일 (파일 2)을 편집 한 후 패턴 일치를 수행 할 수 있습니다. – user1529819

관련 문제