【问题标题】:Access objects inside a class in Python在 Python 中访问类中的对象
【发布时间】:2020-12-25 18:58:45
【问题描述】:

我有一个来自 Biopython 包的名为 SeqRecord 的对象。

此对象包含以下格式的信息:

ID: chr1_8969882_-:chr1_568670_-:a1;113
Name: chr1_8969882_-:chr1_568670_-:a1;113
Description: chr1_8969882_-:chr1_568670_-:a1;113 total_counts: 7600 Seed: 225 K: 20 length: 86
Number of features: 0
Seq('CACTCATGAGCTGTCCCCACATTAGGCTTAAAAACAGATGCAATTCCCGGACGT...ACC', SingleLetterAlphabet())

因此它包含一个序列Seq 和一些其他属性:IDNameDescription 等。

我想要的是计算序列中不同数量的字母。比如:

Secuencia 0:
Number of A´s:
Number of C´s:
Number of G´s:
Number of T´s:

到目前为止我做了什么?

这些对象通常有多个序列,所以我的想法是首先选择所有序列,然后计算每个序列的出现次数:

sequences=[]
for line in object:
   if line.startswith ("Seq"):
      sequences.append(line)

但这会弹出下一条消息:

'SeqRecord' object has no attribute 'startswith'

我也尝试过其他方法,但大多数 python 方法都不能使用这个对象类。

知道如何用基本的 python 解决这个问题吗?*

PD: * SeqRecord 有一些方法可以让你轻松完成,但我想用基本的 python 函数来做

【问题讨论】:

  • Python 标准库也有collections.Counter
  • SeqRecord 不知道这种方法。它不是一个字符串。你可以在一个对象上调用dir() 来查看它的属性(包括它的方法)。
  • 你能解释一下为什么,如果你已经有一个SeqRecord 对象并且它提供了一个你想要的方法,你不想只调用那个方法吗?
  • " python 方法不能使用这个对象类。"什么?问题是您试图将其视为str 对象(不是“python 对象”),但它不是。
  • for line in object: 等等,什么?

标签: python class biopython


【解决方案1】:
sequences=[]
for line in object:
   if line.startswith ("Seq"):
      sequences.append(line)

根据错误消息,它听起来像object(这是 Python 程序中的错误变量名,因为它隐藏了内置的 object 类型——重命名此!!!)是 SeqRecord 的可迭代对象对象,而不是字符串的可迭代对象。 (您将SeqRecord 对象本身与print 它时生成的字符串混淆了——通常,针对实际对象提供的方法进行编码比编写大量额外的代码来解析要容易得多它的字符串表示形式。)要获得 Seq 对象,您可以这样做:

sequences = [record.seq for record in object]

(再次假设您的 SeqRecords 列表称为 object 不应该是,但您没有为我提供将其分配给该名称的代码部分能够修复它。)

但由于 SeqRecord 本身实现了对 Seq 中字母的迭代(如果我正确阅读 the documentation),您可以简单地使用 collections.Counter 计算每个序列中每个字母的出现次数SeqRecords,无需从每个人中提取seq 的额外步骤:

from collections import Counter

for i, sequence in enumerate(object):  # again, DO NOT EVER NAME OBJECTS 'object'
    print(f"Secuencia {i}:")
    for letter, count in Counter(sequence).items():
        print(f"Number of {letter}'s: {count}")

【讨论】:

    【解决方案2】:

    您应该提供您的输入 SeqRecord

    我创造了一个

    在这里查看:Asking Better Questions

    使用 Biopython:

    
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    """
    Created on Thu Dec 31 16:37:39 2020
    
    @author: Pietro
    """
    
    
    
    
    from Bio.Seq import Seq
    
    from Bio.SeqRecord import SeqRecord
    
    from collections import Counter
    
    seqrecordmine = SeqRecord(Seq("CACTCATGAGCTGTCCCCACATTAGGCTTAAAAACAGATGCAATTCCCGGACGT"),id="chr1_8969882_-:chr1_568670_-:a1;113",
    name=" chr1_8969882_-:chr1_568670_-:a1;113",
    description=" chr1_8969882_-:chr1_568670_-:a1;113 total_counts: 7600 Seed: 225 K: 20 length: 86")
    
    
    print(seqrecordmine)
    
    for letter, count in Counter(seqrecordmine.seq).items(): #SeqRecord.seq = seq is a property of SeqRecord objects/Class
            print(f"Number of {letter}'s: {count}")
    
    

    结果:

    ID: chr1_8969882_-:chr1_568670_-:a1;113
    Name:  chr1_8969882_-:chr1_568670_-:a1;113
    Description:  chr1_8969882_-:chr1_568670_-:a1;113 total_counts: 7600 Seed: 225 K: 20 length: 86
    Number of features: 0
    Seq('CACTCATGAGCTGTCCCCACATTAGGCTTAAAAACAGATGCAATTCCCGGACGT')
    Number of C's: 16
    Number of A's: 16
    Number of T's: 12
    Number of G's: 10
    

    【讨论】:

      猜你喜欢
      • 2018-05-09
      • 1970-01-01
      • 2015-05-09
      • 2018-02-26
      • 2015-01-12
      • 1970-01-01
      • 2013-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多