在1000个核苷酸的窗口中迭代序列

时间:2017-04-19 02:49:54

标签: python file-io file-writing

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

"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

非常感谢你看看这个!

1 个答案:

答案 0 :(得分:0)

由于行TypeError: cannot concatenate 'str' and 'int' objects,原始代码因dna_1000.write(...+'_'+pos+...)而失败  将'_'对象type('_') = str添加到对象pos type(pos) = int的位置。这是不可能的,因为Python从不隐式添加字符串和整数:在添加之前必须将int转换为字符串: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功能有用。