0

このコードは、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)

次に、分割されたシーケンスから、その長さが 9 (9 塩基) の 3 つのシーケンスを取得したい例:

    CGTAACAAG 
    AATCCGGAG 
    CCGCCTCGG

最初のシーケンスを 3 塩基の 3 つのサブシーケンスに分割します。したがって、1 つのシーケンスから 3 つのサブシーケンスを取得し、他の 2 つのシーケンスについても同じことを行います。

このような:

    CGT    AAC     AAG 
    AAT    CCG     GAG 
    CCG    CCT     CGG

例:

identical_segment('CGT')

この関数を 3 つのシーケンスの各サブシーケンスに適用し、すべての fasta ファイルに同じことを適用したいと考えています。したがって、目的は行列を取得することです。たとえば、最初のサブシーケンス 'CGT' を取得し、関数identical_segment() を適用すると、28 が返されます。残りの 8 つのサブシーケンスについても同じです。したがって、行列(3,3)を取得します。

28         2             3
4          23            35
23         4             27

私に何ができる?

4

2 に答える 2

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

また、identical_segment を呼び出すたびに、str からスコアへのマッピングとして使用する辞書が生成されます。呼び出しの数がスケーリングすると、高価になる可能性があります。これを回避するには、次の 2 つの方法を試すことができます。

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 倍のコストがかかります。

  2. 同じオブジェクトを何度も作成しないでください。これが起こらないようにコードを校正してください。

  3. 主なタスクをいくつかの小さなタスクに分割し、各タスクを開始するためのシンプルで直感的な方法を考えてください。この例では、processfiles-> analysis-> output_result があります。

  4. 内包表記は、Python で物事を繰り返すための便利な方法であり、より読みやすくなっています。詳細については、リスト内包表記と辞書内包表記を検索できます。

自分で何か試してみてください。改善されたコードをここで読んでいただければ幸いです。

于 2013-07-21T03:04:39.203 に答える
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)
于 2013-09-23T16:37:30.697 に答える