2012-07-16 67 views
1

我有两个文件:第一个是带有头文件和序列的fasta文件,第二个文件仅包含头文件。在python中匹配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 

我想在File_2头与任何在File_1说,直到7具有完全相同的字符匹配 '|'。

我在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 

我尝试过的几种方法使用索引,但是,我的密钥不是唯一的。我怎样才能拿到前六个元素,并让他们成为我的钥匙,还是有比我现在尝试的更好的方法?谢谢。

+0

标头线在File_1和File_2开头“>” ,他们没有出现在文章 – user1529819 2012-07-16 19:28:52

回答

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.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]) 
+0

谢谢我最终确定了如何解析这两个文件。回复整个fasta唱片的头和序列是我的下一个挂断。将很快发布代码。 – user1529819 2012-07-17 21:42:25

+0

@ user1529819 - 上面的正则表达式解决方案返回标题和序列 - 除非我错过了某些东西 – iruvar 2012-07-17 23:06:07

+0

实际上,grep结束了更快更简单的工作。问题是文件1是巨大的,并且将它读入内存是不可行的。使用grep我可以在编辑查询文件(文件2)后进行模式匹配 – user1529819 2012-07-18 16:54:45