Итерация по серии генов GenBank и добавление функций каждого гена в список возвращает только последний ген - PullRequest
1 голос
/ 12 марта 2019

У меня проблема с моим кодом.Я пытаюсь перебрать список генов файла genbank с помощью BioPython.Вот как это выглядит:

class genBank:
    gbProtId = str()
    gbStart = int()
    gbStop = int()
    gbStrand = int()

genBankEntries = list()

for seq_record in SeqIO.parse(genBankFile, "genbank"):
    for seq_feature in seq_record.features:
        genBankEntry = genBank
        if seq_feature.type == "CDS":
            genBankEntry.gbProtId = seq_feature.qualifiers['protein_id']
            genBankEntry.gbStart = seq_feature.location.start # prodigal GFF3 output is 1 based indexing
            genBankEntry.gbStop = seq_feature.location.end 
            genBankEntry.gbStrand = seq_feature.strand
            genBankEntries.append(genBankEntry)

Похоже, что это должно работать, но когда я его запускаю, результирующая структура genBankEntries представляет собой просто огромный стек размером с число генов в файле genbankно только с последним значением в seq_record.features в качестве каждого элемента списка:

00 = {type} <class '__main__.genBank'>
 gbProtId = {list} ['BAA31840.1']
 gbStart = {ExactPosition} 90649
 gbStop = {ExactPosition} 91648
 gbStrand = {int} 1
...
82 = {type} <class '__main__.genBank'>
 gbProtId = {list} ['BAA31840.1']
 gbStart = {ExactPosition} 90649
 gbStop = {ExactPosition} 91648
 gbStrand = {int} 1

Это особенно запутанно, потому что оба цикла for работают правильно:

for seq_record in SeqIO.parse(genBankFile, "genbank"):
    for seq_feature in seq_record.features:
        print(seq_feature)

Почему это

1 Ответ

1 голос
/ 12 марта 2019

Вы никогда не создаете экземпляры класса genBank. Каждая итерация цикла изменяет атрибуты уровня класса genBank класса, и вы каждый раз добавляете один и тот же объект в список. Каждый проход через цикл перезаписывает значения в предыдущем проходе.

Для первой строки вашего внутреннего цикла добавьте скобки для вызова типа и создайте экземпляр genBank. Вместо этого это будет genBankEntry = genBank(). Это создает новый отдельный объект для каждого прохода цикла.

...