2014-09-24 3 views
0

Я хочу объединить все последовательности в файле fasta с фиксированным числом «N», вставленным между последовательностями. Я попытался сделать это, добавив кучу «N» для всех последовательностей в файле fasta и затем объединив измененные последовательности с использованием biopython (на основе кулинарной книги here). Однако мой код печатает каждую из записей по мере их изменения, а затем, наконец, конкатенированную версию, когда я только хочу, чтобы она распечатала последнюю. Я был бы очень признателен, если кто-нибудь может указать на ошибки в моем коде или предложить лучший способ сделать это. Благодаря!Самый быстрый способ добавить «N» s и объединить миллионы последовательностей в fasta

обновление: я исправил код, предложенный Целео, но для обработки моего фактического файла требуется более 12 миллионов последовательностей. У нас есть более быстрый и эффективный способ сделать это с использованием других языков (perl/awk) ? Вот входной образец

$ cat test.fa 
>read_1 
GAAGTACGT 
>read_2 
AACTCAAGAACAAGAAAAAA 
>read_3 
TGGACGACCATTCATGGCGACGTCAAGGTCAATCAT 

Вот мой код:

$cat merge_seq.py 
import sys 
from Bio import SeqIO 
from Bio.Seq import Seq 
in_file = open(sys.argv[1],'r') 
sequences = SeqIO.parse(in_file, "fasta") 
concat=Seq("") 
for record in sequences: 
    record.seq= record.seq + ("N" * 20) 
    concat+=record.seq 
    print concat 

И это выходной ток:

$ python merge_seq.py test.fa 
GAAGTACGTNNNNNNNNNNNNNNNNNNNN 
GAAGTACGTNNNNNNNNNNNNNNNNNNNNAACTCAAGAACAAGAAAAAANNNNNNNNNNNNNNNNNNNN 
GAAGTACGTNNNNNNNNNNNNNNNNNNNNAACTCAAGAACAAGAAAAAANNNNNNNNNNNNNNNNNNNNTGGACGACCATTCATGGCGACGTCAAGGTCAATCATNNNNNNNNNNNNNNNNNNNN 

ответ

0
import sys 
from Bio import SeqIO 
from Bio.Seq import Seq 
in_file = open(sys.argv[1],'r') 
sequences = SeqIO.parse(in_file, "fasta") 
concat=Seq("") 
for record in sequences: 
    record.seq= record.seq + ("N" * 20) 
    concat+=record.seq 
print concat 

Распечатать concat переменная вне из за цикл после завершения добавления.

Выход:

$ python merge_seq.py test.fa 
GAAGTACGTNNNNNNNNNNNNNNNNNNNNAACTCAAGAACAAGAAAAAANNNNNNNNNNNNNNNNNNNNTGGACGACCATTCATGGCGACGTCAAGGTCAATCATNNNNNNNNNNNNNNNNNNNN 
+0

Это works-- такой очевидной ошибки :(однако этот код не очень быстро для моих фактических данных (~ 12 миллионов последовательностей), есть ли у вас какие-либо предложения по ускорению обработки? Благодаря! – psaima

+0

Вы можете комбинировать 'record.seq = record.seq + (" N "* 20)' и 'concat + = record.seq' с' concat + = record.seq + ("N" * 20) 'Я не знайте, что это сэкономит вам много, но, возможно, также не сделает дополнительного шага. – Celeo

+0

пробовал это, все еще очень медленно .. – psaima

0

Ваш код занимает минут с FASTA файл с 1 миллиона записей в моем компьютере.

Первое, вы можете попробовать, чтобы добавить каждую последовательность в список, а затем присоединиться к списку с «NNNNNNNN» (занимает 13 секунд):

sequences = SeqIO.parse("1Million.fas", "fasta") 
seqs = [] 

for sequence in sequences: 
    seqs.append(sequence.seq) 

"NNNNNNNNNN".join(seqs) 

Или вы можете избавиться от Biopython если вы только собираетесь это сделать (занимает 1,6 секунды), или загрузить соединяемую последовательность в другом Seq объекте:

seqs = [] 

with open("1Million.fas") as fasta: 
    prev_seq = [] 
    for line in fasta: 
     if line.startswith(">"): 
      seqs.append("".join(prev_seq)) 
      prev_seq = [] 
     else: 
      prev_seq.append(line.rstrip()) 

# This appends the lines after the last ">" 
seqs.append("".join(prev_seq)) 

"NNNNNNNNNN".join(seqs) 

 Смежные вопросы

  • Нет связанных вопросов^_^