我有一个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
您可以使用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