ロザリンドの問題に取り組もうとしています.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")
インデントを修正できますか? –
ちょうどそれを修正しました。それを指摘してくれてありがとう! –