2012-05-10 104 views
1

我試圖創建一個python程序,它讀取fasta文件「seqs.fa」 ,並讓程序按名稱排列順序。按照FASTA文件的順序排序,按python程序

的FASTA文件看起來是這樣的:

>seqA - human 
GCTGACGTGGTGAAGTCAC 
>seqC - gorilla 
GATGACAA 
GATGAAGTCAG 
>seqB - chimp 
GATGACATGGTGAAGTAAC 

我的計劃是這樣的:

import sys 

inFile = open(sys.argv[1], 'r') 
a = inFile.readlines() 
a.sort() 
seq = ''.join(a[0:]) 
seq = seq.replace('\n', "\n") 
print seq 

預期的結果:

>seqA - human 
GCTGACGTGGTGAAGTCAC 
>seqB - chimp 
GATGACATGGTGAAGTAAC 
>seqC - gorilla 
GATGACAAGATGAAGTCAG 

我的結果:

>seqA - human 
>seqB - chimp 
>seqC - gorilla 
GATGACAA 
GATGAAGTCAG 
GATGACATGGTGAAGTAAC 
GCTGACGTGGTGAAGTCAC 

最後四行是大猩猩,黑猩猩和人類序列,大猩猩序列分成前兩行。

任何人都可以給我一些關於如何排序或解決問題的方法?

+1

我有一些提示。首先,使用複製和粘貼,而不是張貼屏幕截圖。其次,打開一個交互式的Python解釋器 - 如果你不知道如何,[見這裏](http://docs.python.org/tutorial/interpreter.html)。現在依次執行這些行中的每一行。通過輸入「print a」,「a.sort()」,「打印a」等來查看每個結果。第三,想想爲什麼'sort'正在做它正在做的事情。然後考慮一下這個文件提供的信息,使你能夠做出不同的事情。 – senderle

+0

@senderle您的評論讓我在問題上尋找[家庭作業]標籤:) –

回答

3

您的代碼存在一些問題。主要的一點是,在由readlines()返回的列表中,您的描述和序列都是單獨的行,因此當您對列表進行排序時,它們會彼此分離。此外,所有描述都在序列之前,因爲它們在開始時有'>'

二,a[0:]a相同。

三,seq.replace('\n', "\n")不會做任何事情。單引號和雙引號意味着同樣的事情。你用自己替換一個換行符。

讀取fasta文件對於Python來說不​​是一項非常複雜的任務,但我仍然希望能夠提供使用我工作的軟件包 - pyteomics

下面的代碼我會使用:

In [1]: from pyteomics import fasta 

In [2]: with fasta.read('/tmp/seqs.fa') as f: 
    ...:  fasta.write(sorted(f)) 
    ...:  
>seqA - human 
GCTGACGTGGTGAAGTCAC 

>seqB - chimp 
GATGACATGGTGAAGTAAC 

>seqC - gorilla 
GATGACAAGATGAAGTCAG 

爲了這個保存到一個新的文件,給它的名字fasta.write作爲參數:

fasta.write(sorted(f), 'newfile.fa') 

一般來說,pyteomics.fasta是蛋白質序列,不是DNA,但它可以完成這項工作。也許你可以使用它返回元組中描述和序列的事實。

0
file = open("seqs.fa")  
a = file.readlines() 
i = 0 
ar = [] 
while True: 
    l1=file.readline() 
    l2=file.readline() 
    if not (l1 and l2): 
     break; 
    l = l1.strip('\n') + '////////' + l2 
    ar.append(l) 
ar = ar.sort() 
for l in ar: 
    l1 = l.split('////////')[0]+'\n' 
    print l1 
    l2 = l.split('////////')[1] 
    print l2 
5

不要自己實施FASTA閱讀器!像大多數情況一樣,有一些聰明的人已經爲你做了這件事。改爲使用例如BioPython。像這樣:

from Bio import SeqIO 
handle = open("seqs.fa", "rU") 
l = SeqIO.parse(handle, "fasta") 
sortedList = [f for f in sorted(l, key=lambda x : x.id)] 
for s in sortedList: 
    print s.description 
    print str(s.seq)