Несколько входных файлов в виде одного файла вывода из биопиона AlignIO - PullRequest
0 голосов
/ 06 ноября 2018

Я пишу код для преобразования выравнивания из нескольких файлов в формат phylip, а затем вывод всех выравниваний в один файл. Я не могу найти хороший способ заставить AlignIO.write () принимать несколько входных файлов и создавать один выходной файл. Следующий код работает с одним файлом:

import glob
from Bio import AlignIO

path = "alignment?.nexus"

for filename in glob.glob(path):
    for alignment in AlignIO.parse(filename, "nexus"):
        AlignIO.write(alignment, "all_alignments", "phylip-relaxed")

1 Ответ

0 голосов
/ 07 ноября 2018

Вы можете использовать .write() для эффективного добавления к выходному файлу, записав его в дескриптор файла, а не в строковое имя файла:

with open("all_alignments", "w") as output_handle: 
    for filename in glob.glob(path):
        for alignment in AlignIO.parse(filename, "nexus"):
            AlignIO.write(alignment, output_handle, "phylip-relaxed")

Альтернативой может быть yield все выравнивания (или сохранение их в списке или аналогичном), а затем один раз после этого вызовите .write() с повторяемым и строковым именем файла (и форматом) в качестве аргументов:

def yield_alignments():
    for filename in glob.glob(path):
        for alignment in AlignIO.parse(filename, "nexus"):
            yield alignment

AlignIO.write(yield_alignments(), "all_alignments", "phylip-relaxed")

Второй вариант кажется более инвазивным для вашей текущей структуры, но может быть немного более производительным, по крайней мере, в старых версиях Biopython.

...