问题描述
我有一个来自 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
和一些其他属性:ID
、Name
、Description
等
我想要的是计算序列中不同数量的字母。类似的东西:
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 函数来做到这一点
解决方法
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
上使用 SeqRecord
,而无需执行从每个 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}")
的额外步骤:
{{1}},
您应该提供您的输入 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