2016-08-06 8 views
0

ロザリンドの問題に取り組もうとしています.FASTAファイルが1kbで最大10個の配列である場合、コンセンサスシーケンスおよびプロファイル(すべての配列が各ヌクレオチドにおいて共通して有する各塩基の数)を含む。私のレスポンスをフォーマットするというコンテキストでは、私のコードは小さなシーケンス(検証済み)に対して機能します。ロザリンドプロファイルとコンセンサス:長い文字列をPythonで1行に書く(フォーマット)

しかし、大規模なシーケンスに関しては、私の回答のフォーマットに問題があります。 私は返すように期待するもの、長さに関係なく、次のとおりです。

"consensus sequence" 
"A: one line string of numbers without commas" 
"C: one line string """" " 
"G: one line string """" " 
"T: one line string """" " 

お互いに、自分のそれぞれのライン上に並ぶ全て、または私は維持するために、以降の単位としてこのフォーマットを運ぶことができ、少なくともいくつかの書式設定整列の完全性。

大規模な配列に対してコードを実行すると、おそらく文字列自体が長すぎるため、改行で分割されたコンセンサス配列の下に別々の文字列が得られます。私はこの問題を回避する方法を考えるのに苦労してきましたが、私の検索は無駄でした。私はちょうど上記の期待の全体を書くことができますが、チャンクでいくつかの反復的な書き込みアルゴリズムについて考えています。どんな助けも大歓迎です。私は、メインセクションでは必要に応じてブロックコメントをつけて、完全性のために私のコード全体を添付しました。

def cons(file): 
#returns consensus sequence and profile of a FASTA file 
    import os 
    path = os.path.abspath(os.path.expanduser(file)) 

    with open(path,"r") as D: 
     F=D.readlines() 

#initialize list of sequences, list of all strings, and a temporary storage 
#list, respectively 
    SEQS=[] 
    mystrings=[] 
    temp_seq=[] 

#get a list of strings from the file, stripping the newline character 
    for x in F: 
     mystrings.append(x.strip("\n")) 

#if the string in question is a nucleotide sequence (without ">") 
#i'll store that string into a temporary variable until I run into a string 
#with a ">", in which case I'll join all the strings in my temporary 
#sequence list and append to my list of sequences SEQS  
    for i in range(1,len(mystrings)): 
     if ">" not in mystrings[i]: 
      temp_seq.append(mystrings[i]) 
     else: 
      SEQS.append(("").join(temp_seq)) 
      temp_seq=[] 
    SEQS.append(("").join(temp_seq)) 

#set up list of nucleotide counts for A,C,G and T, in that order 
    ACGT=  [[0 for i in range(0,len(SEQS[0]))], 
       [0 for i in range(0,len(SEQS[0]))], 
       [0 for i in range(0,len(SEQS[0]))], 
       [0 for i in range(0,len(SEQS[0]))]] 

#assumed to be equal length sequences. Counting amount of shared nucleotides 
#in each column 
    for i in range(0,len(SEQS[0])-1): 
     for j in range(0, len(SEQS)): 
      if SEQS[j][i]=="A": 
       ACGT[0][i]+=1 
      elif SEQS[j][i]=="C": 
       ACGT[1][i]+=1 
      elif SEQS[j][i]=="G": 
       ACGT[2][i]+=1 
      elif SEQS[j][i]=="T": 
       ACGT[3][i]+=1 

    ancstr="" 
    TR_ACGT=list(zip(*ACGT)) 
    acgt=["A: ","C: ","G: ","T: "] 
    for i in range(0,len(TR_ACGT)-1): 
     comp=TR_ACGT[i] 
     if comp.index(max(comp))==0: 
      ancstr+=("A") 
     elif comp.index(max(comp))==1: 
      ancstr+=("C") 
     elif comp.index(max(comp))==2: 
      ancstr+=("G") 
     elif comp.index(max(comp))==3: 
      ancstr+=("T") 

''' 
writing to file... trying to get it to write as 
consensus sequence 
A: blah(1line) 
C: blah(1line) 
G: blah(1line) 
T: blah(line) 
which works for small sequences. but for larger sequences 
python keeps adding newlines if the string in question is very long... 
''' 


    myfile="myconsensus.txt" 
    writing_strings=[acgt[i]+' '.join(str(n) for n in ACGT[i] for i in  range(0,len(ACGT))) for i in range(0,len(acgt))] 
    with open(myfile,'w') as D: 
     D.writelines(ancstr) 
     D.writelines("\n") 
     for i in range(0,len(writing_strings)): 
      D.writelines(writing_strings[i]) 
      D.writelines("\n") 

両論( "rosalind_cons.txt")

+0

インデントを修正できますか? –

+1

ちょうどそれを修正しました。それを指摘してくれてありがとう! –

答えて

0

あなたのコードの行を除いて完全に罰金です:

writing_strings=[acgt[i]+' '.join(str(n) for n in ACGT[i] for i in  range(0,len(ACGT))) for i in range(0,len(acgt))] 

あなたが誤ってデータを複製します。次のように出力ファイルに書き込み、その後

writing_strings=[ACGT[i] + str(ACGT[i]) for i in range(0,len(ACGT))] 

をして::とそれを交換してみてください

あなたのリストから括弧を取り除くために怠惰な方法だ
D.write(writing_strings[i][1:-1]) 

+0

hm私はあなたが何を意味するのか見ていますが、編集を追加すると、テキストファイルは左括弧とカンマが存在するので(前の結合文)、ヘッダA、G、C、T行方不明この出力を目指しています: A:1 3 4 5 7 3 ... C:2 3 5 6 8 10 ... G:リストからより多くの文字列番号 T:より多くの文字列番号リスト からすべてを1行に整列させるか、少なくとも1行ずつ行うには時間がかかりすぎる場合は、少なくとも新しい行の単位としてこの書式を維持してください。小さいFASTAファイルの場合は ですが、それは私の要求を元々満足させていますが、大きなファイルの場合は、それらのファイルを揃えることができません。 –

+0

私はあなたのコードを試しましたが、改行に問題はありませんでした。どのOSを使用していますか?たぶん単純なコピー&ペーストの問題か、別の問題があります。 –

+0

現在、Windows 10を使用しています。コピー&ペーストの問題があったので、代わりにファイルを書き込むように移行しました。新しいテキストファイルに改行が付きませんか? –

関連する問題