错误比较序列 - 字符串解释为数字

时间:2011-09-05 15:10:20

标签: python biopython

我正在尝试与previous question做类似的事情 我的目的是加入所有相同的序列。但这次不是字母,而是数字。

可以找到

对齐文件here - phylip file

问题是当我尝试这样做时:

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

我收到此错误:

ValueError: Sequence 1 length 49, expected length 1001000000100000100000001000000000000000

我不明白为什么,因为这是我正在创建的第二个文件,第一个文件完美运行..

以下是用于构建对齐文件的代码:

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解释为一个数字,因为它是一个字符串..

有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

您的PHYLIP文件已损坏。标题显示161个序列,但有166.修复当前版本的Biopython似乎加载您的文件。也许在创建标题行时使用len(info_plex)。

P.S。在您的问题中包含Biopython的版本是个好主意。

答案 1 :(得分:1)

Kevin Jacobs在您之前的问题中的代码使用了Biopython,它使用Seq类型的序列

  

«基本上是像AGTACACTGGT这样的字母串,看起来很棒   因为这是看到序列的最常见方式,所以很自然   生物文件格式。 »

     

«Seq个对象与标准之间存在两个重要差异   Python字符串。 (...)

     

首先,他们有不同的方法。 (...)

     

其次, Seq对象具有重要意义   属性alphabet,这是描述个人内容的对象   组成序列字符串的字符“mean”,以及它们应该如何   被解释。例如,AGTACACTGGT是DNA序列,还是只是a   蛋白质序列恰好富含丙氨酸,甘氨酸,   半胱氨酸和苏氨酸?

     

字母表对象可能是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

修改

我理解我的问题:我在代码中使用'fasta'代替'phylip'。

'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!