Запись в файл с изменением кортежа

Мой код проходит последовательность ДНК и записывает позиции ORF, с которыми он сталкивается в этой последовательности. Я пытаюсь сделать две вещи.

  1. Делайте цикл программы, пока он не найдет все ORF, не первые, через которые он проходит
  2. Записать результаты в текстовый файл

Я настроил запись результатов в текстовый файл, но результаты сохраняются в кортеже (который изменяется каждый раз, когда он находит ORF в последовательности). Это делает так, чтобы текстовый файл в конце содержал только последнюю ORF последней введенной последовательности вместо создания списка.

Мой код:

class SeqAnalyzer :
    def __init__(self,sequence):
        self.input = Seq(sequence)
        self.reverse = self.input.reverse_complement()
        self.sequence = str(self.input)
        self.stopcodons = ["TAG", "TAA", "TGA"]
        self.start = 'ATG'
        self.length = 0
        self.result = ("+",0,0,0,0)

    def codon(self,frame):
        start = frame
        while start +3 <=len(self.sequence):
                yield (self.sequence[start:start+3],start)
                start += 3


    def ORF(self, frame, direction):
        orf_beg = 0
        for i, index in self.codon(frame):
            if (
                (str(i) in self.start) or
                (not self.start and i not in str(self.stopcodons))
                ):
                    orf_beg = index + 1
            elif i in self.stopcodons:
                orf_ending = index + 3
                length = (orf_ending - orf_beg) + 1
                if length > self.length:
                    self.length = length
                    self.result = (direction, frame, orf_beg, orf_ending, length)
                break

    def direction(self):
        direction = "+"
        for frame in range(3):
          self.ORF(frame, direction)
        direction = "-"
        for frame in range(3):
            self.sequence = self.reverse
            self.ORF(frame, direction)
        self.results()

    def results(self):
        print(self.result)
        file = open("tass2ORFdata-ATG-100.txt","w")
        file.write("{}{:d} {:>5d}..{:>5d} {:>5d}".format(
                self.result[0], self.result[1], self.result[2],
                self.result[3], self.result[4])
                )

Выходной файл приводит к:

+1     0..   13    14

вместо всех вариаций кортеж содержит в разных точках:

('+', 0, 4, 9, 6)
('+', 1, 5, 10, 6)
('+', 0, 0, 6, 7)
('-', 0, 4, 9, 6)
('-', 1, 5, 10, 6)
('+', 2, 0, 11, 12)
('+', 0, 4, 9, 6)
('+', 1, 5, 10, 6)
('+', 0, 0, 6, 7)
('-', 0, 4, 9, 6)
('-', 1, 5, 10, 6)
('+', 1, 0, 13, 14)

Я пробовал различные способы исправить это, но до сих пор ни один метод не работал.

1 ответ

В вашем __init__ задавать

    self.result = [("+",0,0,0,0), ]

потом, вместо того, чтобы назначить self.result вам нужно append к нему:

self.result.append(direction, frame, ... )

Тогда, когда пришло время печатать:

for row in self.result:
    file.write("...".format(row))
Другие вопросы по тегам