我正在尝试用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
非常感谢你看看这个!
答案 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功能有用。