迭代 1000 个核苷酸的序列 window

Iterating over sequence in a 1000 nucleotide window

我正在尝试在 Python 中编写一个代码来遍历我的 fasta 文件中的每个序列,并使用 1000 个核苷酸滑动 window 打印每个序列的新列表,但我不是确定是哪里出了问题。

"Traceback (most recent call last):
 File "<stdin>", line 4, in <module>
TypeError: expected a string or other character buffer object"

这是我的代码:

from Bio import SeqIO
for record in SeqIO.parse("fasta.txt", "fasta"):
    pos=0
    if pos<len(record)+1:
        dna_1000.write("\n"+">"+record.id+"_"+pos+"\n"+record[pos:pos+1000])
        pos=pos+1000

我试过略有不同:

from Bio import SeqIO
for record in SeqIO.parse("fasta.txt", "fasta"):    
    for pos in range(0,len(record)+1,1000):
        dna_1000.write("\n"+">"+record.id+"_"+"\n"+record[pos:pos+1000])

但我也收到这条消息:

Traceback (most recent call last):
  File "<stdin>", line 3, in <module>
TypeError: expected a string or other character buffer object

非常感谢您看一看!

您的原始代码因 dna_1000.write(...+'_'+pos+...) 行而失败并显示 TypeError: cannot concatenate 'str' and 'int' objects 将对象 '_' where type('_') = str 添加到对象 pos where type(pos) = int。这是不可能的,因为 Python 从不隐式添加字符串和整数:在添加之前必须将整数转换为字符串:dna_1000.write(...+'_'+str(pos)+...).

现在我们遇到了您的另一个错误 TypeError: expected a string or other character buffer object。这源于 dna_1000.write 方法,该方法抱怨它不知道如何处理它的参数。它需要类似字符串的东西,但得到的是 "\n"+">"+record.id+"_"+str(pos)+"\n"+record[pos:pos+1000]),这是一个 SeqRecord。这是因为 record 是一个 SeqRecord,切片 SeqRecord 给你一个 SeqRecord,并且向 SeqRecord 添加一个字符串给你一个 SeqRecord(具有修改的核苷酸序列)。

要实际访问切片的 record 的基础核苷酸序列,您需要使用 .seq,并将其写入文件,您需要将其转换为字符串。所以为了让你的代码 运行 没有错误,你可以这样做:

from Bio import SeqIO
for record in SeqIO.parse("fasta.txt", "fasta"):
    pos=0
    if pos<len(record)+1:
        seqstr = str(record[pos:pos+1000].seq)
        dna_1000.write("\n"+">"+record.id+"_"+str(pos)+"\n"+seqstr)
        pos=pos+1000

这是否是解决您问题的最佳方法(或者这段代码是否达到您的预期)是另一个我没有背景知识可以回答的问题。我唯一的其他建议是通读 http://biopython.org/wiki/SeqIO 看看是否有任何包含的 IO 函数会有所帮助。