0

前の質問と同じようなことをしようとしています。
私の目的は、等しいすべてのシーケンスを結合することです。でも今回は文字の代わりに数字があります。

アラインメントファイルはここにあります-phylipファイル

問題は、私がこれを行おうとしたときです。

records = list(SeqIO.parse(file(filename),'phylip'))

このエラーが発生します:

ValueError: Sequence 1 length 49, expected length 1001000000100000100000001000000000000000

これが私が作成している2番目のファイルであり、最初のファイルが完全に機能したため、理由がわかりません。

以下は、アライメントファイルの作成に使用されるコードです。

fl.write('\t')
fl.write(str(161))
fl.write('\t')
fl.write(str(size))
fl.write('\n')

for i in info_plex:
    if 'ref' in i[0]:
        i[0] = 'H37Rv'
    fl.write(str(i[0]))
    num = 10 - len(i[0])
    fl.write(' ' * num)
    for x in i[1:]:
        fl.write(str(x))
    fl.write('\n')

したがって、1001000000100000100000001000000000000000は文字列であるため、数値として解釈されるべきではありません。

何か案は?

ありがとうございました!

4

2 に答える 2

2

PHYLIP ファイルが壊れています。ヘッダーには 161 シーケンスと書かれていますが、166 あります。Biopython の現在のバージョンがファイルを正常にロードするように見える問題を修正します。ヘッダー行を作成するときは、おそらく len(info_plex) を使用してください。

PS 質問に Biopython のバージョンを含めることをお勧めします。

于 2011-09-06T11:15:12.327 に答える
1

以前の質問のケビン・ジェイコブスのコードは、型のシーケンスを使用するBiopythonSeqを採用しています

« は本質的に AGTACACTGGT のような文字列です。これは生物学的ファイル形式で配列が見られる最も一般的な方法であるため、非常に自然に思えます。»

Seq«オブジェクトと標準の Python 文字列には 2 つの重要な違いがあります。(...)

まず、方法が違います。(...)

次に、Seq オブジェクトには重要な属性alphabetがあります。これは、シーケンス文字列を構成する個々の文字が「意味」するものと、それらがどのように解釈されるべきかを記述するオブジェクトです。たとえば、AGTACACTGGT は DNA 配列ですか、それともたまたまアラニン、グリシン、システイン、スレオニンが豊富なタンパク質配列ですか?

アルファベット オブジェクトはおそらく、Seq
オブジェクトを単なる文字列以上のものにする重要な要素です。Biopython で現在利用可能なアルファベットは、Bio.Alphabet モジュールで定義されています。»

http://biopython.org/DIST/docs/tutorial/Tutorial.html

あなたの問題の理由は、それらを管理できる属性がない文字を含むファイルからオブジェクトを SeqIO.parse()作成できないという単純なものです。Seqalphabet

.

したがって、別の方法を使用する必要があります。別の問題に不適応な方法を適用しようとしないでください。

これが私のやり方です:

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 !

于 2011-09-06T17:54:35.010 に答える