【问题标题】:Iterating through a series of GenBank genes and appending each gene's features to a list returns only the last gene遍历一系列 GenBank 基因并将每个基因的特征附加到列表中仅返回最后一个基因
【发布时间】:2019-08-03 07:38:57
【问题描述】:

我的代码有问题。我正在尝试使用 BioPython 遍历 genbank 文件的基因列表。这是它的样子:

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)

这是为什么?

【问题讨论】:

    标签: python list bioinformatics biopython genbank


    【解决方案1】:

    您永远不会创建genBank 类的任何实例。每次循环迭代都在更改 genBank 类的类级别属性,并且每次都将相同的对象添加到列表中。每次循环都会覆盖上一次循环中的值。

    对于内部循环的第一行,添加括号以调用类型并创建genBank 的实例。它将改为genBankEntry = genBank()。这会为每个循环传递创建一个新的不同对象。

    【讨论】:

    • 谢谢你,我是 python 新手,我只是接受我的 IDE 给我的任何建议。我已经习惯了代码甚至无法运行的 Java。再次感谢。
    猜你喜欢
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 2023-02-09
    相关资源
    最近更新 更多