我试图用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
非常感谢你来看这个!
发布于 2017-04-19 05:08:38
原始代码在TypeError: cannot concatenate 'str' and 'int' objects
中失败,因为dna_1000.write(...+'_'+pos+...)
行将对象'_'
where type('_') = str
添加到对象pos
where type(pos) = int
中。这是不可能的,因为Python从不隐式地添加字符串和int :您必须在添加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函数是否有帮助。
https://stackoverflow.com/questions/43485479
复制相似问题