3

私が取り組んでいるバイオインフォマティクス プロジェクトでコーディングに少し問題があります。基本的に、私の仕事は、データベースからモチーフ配列を抽出し、その情報を使用して配列アラインメント ファイルに注釈を付けることです。アラインメント ファイルはプレーン テキストであるため、アノテーションは精巧なものではなく、せいぜいアラインメント ファイル自体で抽出された配列をアスタリスクに置き換えるだけです。

データベース ファイルをスキャンし、必要なすべてのシーケンスを抽出し、それらを出力ファイルに書き込むスクリプトがあります。私が必要とするのは、クエリが与えられた場合、これらのシーケンスを読み取り、ASCII アライメント ファイル内の対応する部分文字列と一致させることです。最後に、モチーフ シーケンス (非常に大きな文字列の部分文字列) が出現するたびに、モチーフ シーケンス XXXXXXX を一連のアスタリスク*に置き換えます。

私が使用しているコードは次のようになります (11SGLOBULIN はデータベース内のタンパク質エントリの名前です)。

motif_file = open('/users/myfolder/final motifs_11SGLOBULIN','r')
align_file = open('/Users/myfolder/alignmentfiles/11sglobulin.seqs', 'w+') 
finalmotifs = motif_file.readlines()
seqalign = align_file.readlines() 


for line in seqalign:
    if motif[i] in seqalign:  # I have stored all motifs in a list called "motif"
        replace(motif, '*****') 

ただし、各文字列を一連のアスタリスクに置き換える代わりに、ファイル全体を削除します。なぜこれが起こっているのか誰にもわかりますか?

問題は、私の ASCII ファイルが基本的にアミノ酸の非常に長いリストの 1 つにすぎず、Python が非常に長い文字列内に隠されている特定の部分文字列を置き換える方法を認識できないという事実にあると思われます。

4

4 に答える 4

2

w+ファイルモードを誤解しています。でモードw+を使用するopenと、ファイルが切り詰められます (つまり、ファイル内のすべてが削除されます) 。 http://docs.python.org/library/functions.html#openを参照してください。あなたが呼び出すとすぐにあなたのseqデータはなくなります:

align_file = open('/Users/myfolder/alignmentfiles/11sglobulin.seqs', 'w+')

またreplace、ファイルから読み取った文字列を操作します。変更された文字列を明示的に書き戻す必要があります。

最善の策は、3 番目のファイルを使用して結果を保存することです。本当にやりたい場合align_fileは、完了時に結果のファイルを元のファイルにコピーできます。

于 2011-05-03T14:49:49.263 に答える
2

次のようなものがうまくいくはずです。サンプルを投稿しておらず、python 2.7 を実行しているため、入力データについて推測しました。

motifs = [ x.strip() for x in open('final motifs_11SGLOBULIN','r') ]
redact = '*****'

with open('11sglobulin.seqs','r') as data_in, open('11sglobulin.seqs.new','w') as data_out:
  for seq in data_in:
    for motif in motifs:
      while True:
        x = seq.find(motif)
        if x >= 0:
          seq = seq[:x] + redact + seq[x+len(motif):]
        else:
          break
  data_out.write(seq)
于 2011-05-03T14:16:08.257 に答える
1

最も内側のwhileループを次のように変更することで、これをもう少し単純化できます。

while True:
    x = seq.find(motif)
    if x >= 0:
      seq = seq[:x] + redact + seq[x+len(motif):]
    else:
      break

に:

if motif in seq:
  seq = seq.replace(motif, redact)
于 2011-05-03T14:34:52.523 に答える
0

皆さん、ありがとうございます。回答に本当に感謝しています。したがって、基本的に私がすべきことは、多くの人が指摘したように、ファイルを開いて注釈を付け、それらの注釈を新しいファイルに書き込むことでした。このビットのコードはトリックを行いました:

align_file_rmode = open('/Users/spyros/folder1/python/printsmotifs/alignfiles/query, 'r') 
align_file_amode = open('/Users/spyros/folder1/python/printsmotifs/alignfiles/query, 'a+')

finalmotifs = motif_file.readlines()
seqalign = align_file_rmode.readlines() 

for line in seqalign: 
   for item in finalmotifs:
      item = item.strip().upper()
      if item in line:
         line = line.replace(item, '$' * len(item)) 
         align_file_amode.write(line) 

motif_file.close()
align_file_rmode.close()
align_file_amode.close()
于 2011-05-07T15:48:30.590 に答える