2012-05-10 12 views
1

私は、fastaファイル "seqs.fa" を読み込み、その名前でシーケンスをソートするプログラムを持つpythonプログラムを作成しようとしていました。PythonプログラムのFASTAファイルから順番に並べ替え

の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 

最後の4行はゴリラ、チンパンジー、およびヒトの配列で、ゴリラの配列は最初の2行に分かれています。

誰でも私にそれを整理する方法や問題を解決する方法に関するヒントを教えてもらえますか?

+1

私はいくつかのヒントを持っています。まず、スクリーンショットを投稿するのではなく、コピー&ペーストを使用します。次に、インタラクティブなPythonインタプリタを開きます。あなたがどのようにわかっていれば[こちらをご覧ください](http://docs.python.org/tutorial/interpreter.html)。今度は、これらの行のそれぞれを順番に実行してください。それぞれの結果を 'print a'、' a.sort() '、' print a'などと入力して調べてください。第三に、 'ソート'が何をしているのかを考えてみましょう。次に、ファイルが提供する情報が、あなたが何か別のことをさせることを可能にすると考えてください。 – senderle

+0

@senderleあなたのご意見は、私が質問の[宿題]タグを探すようにしました:) –

答えて

3

コードに問題があります。主なものは、readlines()によって返されたリストの中で、あなたの説明とシーケンスはすべて別々の行なので、リストをソートすると、それらは互いに切り離されます。また、すべての説明は、最初に'>'を持っているため、シーケンスの前に移動します。

第2に、a[0:]aと同じです。

第3に、seq.replace('\n', "\n")は何も行いません。一重引用符と二重引用符は同じことを意味します。改行文字をそれ自身に置き換えます。

ファーストファイルの読み込みは、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) 
関連する問題