2017-04-19 82 views
1

我正在嘗試在Python中編寫一段代碼,以便遍歷fasta文件中的每個序列,並使用1000個核苷酸的滑動窗口打印每個序列的新列表,但我不確定是什麼是錯的。在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

你原來的代碼失敗,因爲行dna_1000.write(...+'_'+pos+...) ,你的對象'_'其中type('_') = str添加到對象pos其中type(pos) = intTypeError: cannot concatenate 'str' and 'int' objects。這是不可能的,因爲Python從未隱式添加字符串和整數:在添加它之前,必須將int轉換爲字符串:dna_1000.write(...+'_'+str(pos)+...)

現在我們遇到您的其他錯誤TypeError: expected a string or other character buffer object。這起源於dna_1000.write方法,它抱怨說它不知道如何處理它的論點。它期望像一個字符串的東西,但得到這是一個SeqRecord "\n"+">"+record.id+"_"+str(pos)+"\n"+record[pos:pos+1000])。這是因爲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功能可以提供幫助。

+1

謝謝Trevor的解釋。我知道Python不能組合字符串和整數,但是我在編寫代碼時很難應用這條規則。 您的建議確實有幫助。我只需要將「if」循環更改爲「while」循環,因爲否則它僅顯示所有記錄的「第一個」滑動窗口,因爲if語句爲true(pos在外部定義)。它現在很好用。非常感謝! –