Разделение многопоследовательного файла белка fasta на множество файлов с помощью Biopython

#python #file #split #biopython #fasta

#python #файл #разделение #biopython #fasta

Вопрос:

 def batch_iterator(iterator, batch_size) :
    entry = True
    while entry :
        batch = []
        while len(batch) < batch_size :
            try :
                entry = iterator.__next__
            except StopIteration :
                entry = None
            if entry is None :
                #End of file
                break
            batch.append(entry)
        if batch :
            yield batch



from Bio import SeqIO

record_iter = SeqIO.parse(open("C:\Users\IDEAPADDesktop\fypsplit\protein.fasta"),"fasta")
for i, batch in enumerate(batch_iterator(record_iter, 1000)):
    filename = "group_%i.fasta" % (i   1)
    with open(filename, "w") as handle:
        count = SeqIO.write(batch, handle, "fasta")
    print("Wrote %i records to %s" % (count, filename))
 

Я пытаюсь разделить файл fasta с помощью Biopython. Я хочу сделать его похожим на 7 файлов в этом примере. Но я получаю сообщение об ошибке AttributeError: 'function' object has no attribute 'id' .

Кто-нибудь может мне помочь? Заранее благодарю

Ответ №1:

В этой строке выдается ошибка AttributeError

 count = SeqIO.write(batch, handle, "fasta")
 

потому SeqIO.write что ожидает итерацию или список типов SeqRecord . Однако вместо этого вы batch_iterator создаете список методов.

Почему методы? Ну, здесь вам не хватает вызова функции:

 entry = iterator.__next__
 

должно быть

 entry = iterator.__next__()
 

Это позволяет выполнить код без ошибок.

Для тестового файла, состоящего из 11 последовательностей, я получил следующий результат — после изменения размера пакета с 1000 до 4 для целей тестирования:

 Wrote 4 records to group_1.fasta
Wrote 4 records to group_2.fasta
Wrote 3 records to group_3.fasta
 

Комментарии:

1. здравствуйте, что, если я собираюсь разбить на 7 файлов? вместо такого количества файлов?

2. Откуда взялось это число 7? В файле fasta может быть несколько последовательностей белка. Если существует 5 последовательностей, разделение на 5 файлов имеет смысл. Если существует 100 последовательностей, разделение на 100 файлов имеет смысл. В соответствии с какими критериями вы хотите разделить свой файл?

3. мой первоначальный план состоял в том, чтобы загрузить всю мою последовательность белка генома (файл fasta) в hmmer, чтобы получить список идентификаторов pfam моего генома. но у этого инструмента есть ограничение на последовательность, которая составляет минимум 5000 п.н. .. таким образом, я сталкиваюсь с разделением моего файла последовательности белка на 7файлы.. поскольку белок для генома равен 3224

4. Я понимаю. В этом случае ваш batch_iterator, похоже, справится с задачей, если вы добавите скобки, как я предложил. Я протестировал его с небольшим файлом образца и очень маленьким размером пакета. Обновленный ответ.

5. @LydiavanDyke большое вам спасибо за вашу помощь .. теперь мне удалось разделить мои файлы на 7 файлов… хорошего дня и счастливого нового года!

Ответ №2:

доступный модуль использования: подробнее-itertools

 
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Thu Dec 31 08:30:32 2020

@author: Pietro

"""


from Bio import SeqIO

from more_itertools import ichunked

fasta_file = ""C:\Users\IDEAPADDesktop\fypsplit\protein.fasta""
seqA = record_iter = SeqIO.parse(open(fasta_file),"fasta")


group = 1

for chunk in ichunked(seqA, 1000):
    with open(fasta_file '_group_' str(group), "w ") as file_write:
        for seq_record in chunk:
            SeqIO.write((seq_record),file_write, "fasta")
            group  = 1