【问题标题】:matching headers in fasta files with python用python匹配fasta文件中的头文件
【发布时间】:2012-07-16 19:27:44
【问题描述】:

我有两个文件:第一个是带有标题和序列的 fasta 文件,第二个仅由标题组成。

文件_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 中的标头与 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

我尝试过的几种方法都使用索引,但是,我的键不是唯一的。如何获取前六个元素并将它们作为我的关键,或者有没有比我正在尝试的当前方法更好的方法?谢谢。

【问题讨论】:

  • File_1 和 File_2 中的标题行以'>'开头,它们没有出现在帖子中

标签: python string pattern-matching biopython


【解决方案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)

【讨论】:

    【解决方案2】:

    这种方法涉及内存映射 file_1.txt,通过它运行 re.finditer 以将行加载到由 header 键入的 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])
    

    【讨论】:

    • 谢谢我最终弄清楚了如何解析这两个文件。返回带有标题和序列的整个 fasta 记录是我的下一个挂断电话。将很快发布代码。
    • @user1529819 - 上面的正则表达式解决方案返回标题和序列 - 除非我遗漏了什么
    • 实际上 grep 最终工作得更快、更容易。问题是文件 1 很大,将其读入内存是不可行的。使用 grep 我可以在编辑查询文件(文件 2)后进行模式匹配
    • map 是一个内置函数,你不应该屏蔽它。
    • @xApple,并不是我不同意你的观点,而是官方文档中的示例正是这样做的:docs.python.org/2/library/mmap.html
    猜你喜欢
    • 1970-01-01
    • 2023-03-13
    • 2017-07-29
    • 2014-03-27
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多