以前の質問のケビン・ジェイコブスのコードは、型のシーケンスを使用するBiopythonSeq
を採用しています
« は本質的に AGTACACTGGT のような文字列です。これは生物学的ファイル形式で配列が見られる最も一般的な方法であるため、非常に自然に思えます。»
Seq
«オブジェクトと標準の Python 文字列には 2 つの重要な違いがあります。(...)
まず、方法が違います。(...)
次に、Seq オブジェクトには重要な属性、alphabet
があります。これは、シーケンス文字列を構成する個々の文字が「意味」するものと、それらがどのように解釈されるべきかを記述するオブジェクトです。たとえば、AGTACACTGGT は DNA 配列ですか、それともたまたまアラニン、グリシン、システイン、スレオニンが豊富なタンパク質配列ですか?
アルファベット オブジェクトはおそらく、Seq
オブジェクトを単なる文字列以上のものにする重要な要素です。Biopython で現在利用可能なアルファベットは、Bio.Alphabet モジュールで定義されています。»
http://biopython.org/DIST/docs/tutorial/Tutorial.html
あなたの問題の理由は、それらを管理できる属性がない文字を含むファイルからオブジェクトを SeqIO.parse()
作成できないという単純なものです。Seq
alphabet
.
したがって、別の方法を使用する必要があります。別の問題に不適応な方法を適用しようとしないでください。
これが私のやり方です:
from itertools import groupby
from operator import itemgetter
import re
regx = re.compile('^(\d+)[ \t]+([01]+)',re.MULTILINE)
with open('pastie-2486250.rb') as f:
records = regx.findall(f.read())
records.sort(key=itemgetter(1))
print 'len(records) == %s\n' % len(records)
n = 0
for seq,equal in groupby(records, itemgetter(1)):
ids = tuple(x[0] for x in equal)
if len(ids)>1:
print '>%s :\n%s' % (','.join(ids), seq)
else:
n+=1
print '\nNumber of unique occurences : %s' % n
結果
len(records) == 165
>154995,168481 :
0000000000001000000010000100000001000000000000000
>123031,74772 :
0000000000001111000101100011100000100010000000000
>176816,178586,80016 :
0100000000000010010010000010110011100000000000000
>129575,45329 :
0100000000101101100000101110001000000100000000000
Number of unique occurences : 156
.
編集
私の問題を理解しました。コードに「phylip」の代わりに「fasta」を入れました。
「phylip」は属性の有効な値であり、alphabet
正常に機能します
records = list(SeqIO.parse(file('pastie-2486250.rb'),'phylip'))
def seq_getter(s): return str(s.seq)
records.sort(key=seq_getter)
ecr = []
for seq,equal in groupby(records, seq_getter):
ids = tuple(s.id for s in equal)
if len(ids)>1:
ecr.append( '>%s\n%s' % (','.join(ids),seq) )
print '\n'.join(ecr)
生産する
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
>154995,168481
0000000000001000000010000100000001000000000000000
>123031,74772
0000000000001111000101100011100000100010000000000
>176816,178586,80016
0100000000000010010010000010110011100000000000000
>129575,45329
0100000000101101100000101110001000000100000000000
面白いデータの前にすごい量の文字がある,,,,,,,,,,,,,,,,
んだけど、なんだろう。
.
しかし、私のコードは役に立たないわけではありません。見る:
from time import clock
from itertools import groupby
from operator import itemgetter
import re
from Bio import SeqIO
def seq_getter(s): return str(s.seq)
t0 = clock()
with open('pastie-2486250.rb') as f:
records = list(SeqIO.parse(f,'phylip'))
records.sort(key=seq_getter)
print clock()-t0,'seconds'
t0 = clock()
regx = re.compile('^(\d+)[ \t]+([01]+)',re.MULTILINE)
with open('pastie-2486250.rb') as f:
records = regx.findall(f.read())
records.sort(key=itemgetter(1))
print clock()-t0,'seconds'
結果
12.4826178327 seconds
0.228640588399 seconds
比率 = 55 !