2013-07-21 43 views
0

該代碼可用於從FASTA文件提取和分離序列如何分割的fasta文件

outfile=open('outf','w') 
for line in open('input'): 
     if line[0]==">": 
     outfile.write('\n') 
    else: 
    outfile.write(line.strip()) 

    outfile.close() 
all_codons=[] 
for line in open('outf', 'r'): 
    seq=line.strip() 
    codons = [seq[i:i+3] for i in xrange(0, len(seq), 3) if len(seq[i:i+3])==3] 
    all_codons.append(codons) 

然後,從我想利用三個序列其長度的splited序列是9(9個鹼基)例如:

CGTAACAAG 
    AATCCGGAG 
    CCGCCTCGG 

我把第一個序列分成3個鹼基的3個子序列,所以從一個序列我得到3個子序列,我對這兩個其他序列做同樣的事情。

像這樣:

CGT AAC  AAG 
    AAT CCG  GAG 
    CCG CCT  CGG 

例如:

identical_segment('CGT') 

我想這個功能適用於日三個序列的每個子序列,然後應用在所有的fasta文件同樣的事情。因此,目的是獲得矩陣,例如我採用第一個子序列'CGT'並應用函數identical_segment(),它返回28,其餘8個子序列的結果相同。所以我得到一個矩陣(3,3):

28   2    3 
4   23   35 
23   4    27 

我該怎麼辦?

+2

你不應該發表一個新的問題來澄清一個較舊的問題!只需點擊舊問題上的「編輯」按鈕並在其中添加信息即可。 – seth

回答

0

代碼中存在一些問題。

首先,您只需要文件中的某些行,拋出其他行,然後將所需的行輸出到文件。我不確定爲什麼需要最後一步。直接處理生產線效率更高。

def processLines(inputname): 
    all_codons=[] 
    for line in open(inputname): 
     if line[0]==">": 
      seq=line.strip() 
      codons = [seq[i:i+3] for i in xrange(0, len(seq), 3) if 
         len(seq[i:i+3])==3] 
     all_codons.append(codons) 
    return all_codons 

另外,每次調用same_segment都會生成一個字典,用作從str到分數的映射。通話次數可能會變得很大。爲避免這種情況,您可以嘗試兩種方法:

code={"a":0,"c":1,"g":2,"t":3} 
def identical_segment(input_string): 
    .... # what you have written 

或者創建一個實例包含字典的類。

爲了處理多個文件,這樣做:

output = [processLines(filename) for filename in filenames] 
# filenames is an iterable 

,或者如果你想輸入的名稱映射到輸出:

outputDict = {filename: processLines(filename) for 
       filename in filenames} 

畢竟,呼籲每個輸出的分析功能和將它們寫入輸出文件。

總之,你應該在這個崗位拿起什麼:

  1. 輸出文件可能不是最好的選擇,因爲文件IO是昂貴的。如果你將它寫入某個文件,這意味着你必須再次讀取它,這是非常昂貴的。

  2. 不應該一遍又一遍地創建相同的對象。校對你的代碼以確保不會發生。

  3. 將您的主要任務劃分爲幾個小任務,然後爲每個任務開始時想一個簡單而直觀的方法。在這個例子中,我們有processfiles-> analysis-> output_result

  4. 理解是一種在Python中迭代事物的有用方法,它更具可讀性。您可以搜索列表理解和詞典理解以瞭解更多信息。

嘗試一下自己。我會很樂意在這裏閱讀您的改進代碼。

0

嘗試使用BioPython從fasta文件中提取核苷酸序列。使用這個包,

from Bio import AlignIO 

for record in AlignIO.parse('filename.fasta', 'fasta'): 
    print record.id, record.seq 

# or store in a new file 
seqs = [] 
for record in AlignIO.parse('filename.fasta', 'fasta'): 
    seqs.append(record.seq + '\n') 

with open(outfile, 'w') as out: 
    out.writelines(seqs)