使用python对fasta序列的顺序进行排序

问题描述 投票:1回答:1

我有一个fasta文件(由>标题和序列行组成),如下所示:

myfasta

>S.sclerotiorum_Ch16_153_209
AACCCTAACCCTAACCCTTGATTGATTGATTGATTGATTGAT
TGATTGATGAAATTATAGTCTCCGTAAAGCAAATAAAGCATT
TAGTAAACGTTGAAGAGCTAGAAAAGCTTTAATACAAAAAGG
>S.sclerotiorum_Ch16_153_209
AACCCTAACCCTAACCCTTGATTGATTGATTGATTGATTGAT
TAGTAAACGTTGAAGAGCTAGAAAAGCTTTAATACAAAAAGG
>S.sclerotiorum_Ch14_442_1137
TGTCAATTCGATCTAGTATT
>S.sclerotiorum_Ch12_1831_180
AGAGCTAGAAAAGCTTTAAT
>S.sclerotiorum_Ch1_1831_180
AGAGCTAGAAAAGCTTTAATAGAGCTAGAAAAGCTTTAAT
AGAGCTAGAAAAGCTTTAATAGAGCTAGAAAAGCTTTAAT

我想以定义的顺序打印此文件(从Ch1到Ch16开始)并获得如下结果:

>S.sclerotiorum_Ch1_1831_180
AGAGCTAGAAAAGCTTTAATAGAGCTAGAAAAGCTTTAAT
AGAGCTAGAAAAGCTTTAATAGAGCTAGAAAAGCTTTAAT
>S.sclerotiorum_Ch12_1831_180
AGAGCTAGAAAAGCTTTAAT
>S.sclerotiorum_Ch14_442_1137
TGTCAATTCGATCTAGTATT
>S.sclerotiorum_Ch16_153_209
AACCCTAACCCTAACCCTTGATTGATTGATTGATTGATTGAT
TAGTAAACGTTGAAGAGCTAGAAAAGCTTTAATACAAAAAGG
>S.sclerotiorum_Ch16_153_209
AACCCTAACCCTAACCCTTGATTGATTGATTGATTGATTGAT
TGATTGATGAAATTATAGTCTCCGTAAAGCAAATAAAGCATT
TAGTAAACGTTGAAGAGCTAGAAAAGCTTTAATACAAAAAGG

我试着编写这段代码,但我仍然在result.fasta中获得与输入文件相同的顺序。在修复我的代码时,我们将不胜感激。谢谢!

代码:python code.py myfasta.fasta >> result.fasta

#!/usr/bin/env python
import sys
import os
import pathlib

myfasta = sys.argv[1]
fasta = open(myfasta)

#types = ['S.sclerotiorum_Ch16_', 'S.sclerotiorum_Ch15_', 'S.sclerotiorum_Ch14_', 'S.sclerotiorum_Ch13_', 'S.sclerotiorum_Ch12_', 'S.sclerotiorum_Ch11_', 'S.sclerotiorum_Ch10_', 'S.sclerotiorum_Ch9_', 'S.sclerotiorum_Ch8_', 'S.sclerotiorum_Ch7_', 'S.sclerotiorum_Ch6_', 'S.sclerotiorum_Ch5_', 'S.sclerotiorum_Ch4_', 'S.sclerotiorum_Ch3_', 'S.sclerotiorum_Ch2_', 'S.sclerotiorum_Ch1_']

types = ['S.sclerotiorum_Ch1', 'S.sclerotiorum_Ch2', 'S.sclerotiorum_Ch3', 'S.sclerotiorum_Ch4', 'S.sclerotiorum_Ch5', 'S.sclerotiorum_Ch6', 'S.sclerotiorum_Ch7', 'S.sclerotiorum_Ch8', 'S.sclerotiorum_Ch9', 'S.sclerotiorum_Ch10', 'S.sclerotiorum_Ch11', 'S.sclerotiorum_Ch12', 'S.sclerotiorum_Ch13', 'S.sclerotiorum_Ch14', 'S.sclerotiorum_Ch15', 'S.sclerotiorum_Ch16']




for type in range(len(types)):
    flag = False
    fasta = open(myfasta)
    for line in fasta:
        if line.startswith('>') and types[type] in line:
            flag = True
        elif line.startswith('>'):
          flag = False
        if flag:
            #grabbed = line.strip()
            #newfasta.writelines(grabbed + "\n")
            print(line.strip())

fasta.close
python fasta
1个回答
1
投票

您可以使用re.findall,其模式匹配一​​行,后跟以非>字符开头的行,并在Ch之后对数字进行分组,使用sorted根据数字对匹配进行排序,并使用str.join将已排序的子字符串连接起来到一个字符串:

import re
''.join(s for s, _ in sorted(re.findall(r'(.*_Ch(\d+)_.*\n(?:[^>].*\n)*)', f), key=lambda t: int(t[1])))

鉴于您的输入字符串存储在f中(您应该首先将整个文件读入此变量),这将返回:

>S.sclerotiorum_Ch1_1831_180
AGAGCTAGAAAAGCTTTAATAGAGCTAGAAAAGCTTTAAT
>S.sclerotiorum_Ch12_1831_180
AGAGCTAGAAAAGCTTTAAT
>S.sclerotiorum_Ch14_442_1137
TGTCAATTCGATCTAGTATT
>S.sclerotiorum_Ch16_153_209
AACCCTAACCCTAACCCTTGATTGATTGATTGATTGATTGAT
TGATTGATGAAATTATAGTCTCCGTAAAGCAAATAAAGCATT
TAGTAAACGTTGAAGAGCTAGAAAAGCTTTAATACAAAAAGG
>S.sclerotiorum_Ch16_153_209
AACCCTAACCCTAACCCTTGATTGATTGATTGATTGATTGAT
TAGTAAACGTTGAAGAGCTAGAAAAGCTTTAATACAAAAAGG
© www.soinside.com 2019 - 2024. All rights reserved.