2

fastaファイル「seqs.fa」を読み取り、シーケンスを名前順にソートするプログラムを作成する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

最後の 4 行はゴリラ、チンパンジー、および人間のシーケンスで、ゴリラのシーケンスは最初の 2 行に分割されています。

誰かがそれを並べ替える方法や問題を解決する方法についてのヒントを教えてもらえますか?

4

3 に答える 3

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)
于 2012-05-11T02:36:09.413 に答える
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 ではなくタンパク質配列用ですが、機能します。タプルで説明とシーケンスを返すという事実を利用できるかもしれません。

于 2012-05-10T22:34:48.050 に答える
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
于 2012-05-10T22:38:20.467 に答える