Python 比较序列时出错-字符串被解释为数字

Python 比较序列时出错-字符串被解释为数字,python,biopython,Python,Biopython,我正试图用我的电脑做类似的事情。 我的目的是连接所有相等的序列。但这一次,我用数字代替了字母 可以找到对齐文件 问题是当我尝试这样做时: records = list(SeqIO.parse(file(filename),'phylip')) 我得到这个错误: ValueError: Sequence 1 length 49, expected length 1001000000100000100000001000000000000000 我不明白为什么,因为这是我正在创建的第二个文件,第一

我正试图用我的电脑做类似的事情。
我的目的是连接所有相等的序列。但这一次,我用数字代替了字母

可以找到对齐文件

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

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')
所以它不应该将1001000000000001000000000000000解释为一个数字,因为它是一个字符串

有什么想法吗


谢谢大家!

您的PHYLIP文件已损坏。标题上写着161个序列,但有166个。修复当前版本的Biopython似乎可以很好地加载您的文件。在创建标题行时,可以使用len(info_plex)


另外,在你的问题中加入Biopython的版本是个好主意。

你的PHYLIP文件已损坏。标题上写着161个序列,但有166个。修复当前版本的Biopython似乎可以很好地加载您的文件。在创建标题行时,可以使用len(info_plex)


另外,在你的问题中加入Biopython的版本是一个好主意。

在你前一个问题中,Kevin Jacobs的代码使用了

«本质上是像AGTACACTGGT这样的字母串,看起来非常复杂 自然,因为这是序列在图像中最常见的方式 生物文件格式。»

«对象和标准之间有两个重要区别 Python字符串。(……)

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

其次,Seq对象具有重要的 属性
字母表
,它是一个对象,用于描述个体 组成序列字符串“mean”的字符,以及它们应该如何 被解释。例如,AGTAACTGGT是一个DNA序列,还是仅仅是一个DNA序列 富含丙氨酸,甘氨酸, 半胱氨酸和苏氨酸

字母表对象可能是使
Seq

对象不仅仅是字符串当前可用的字母表 Biopython在Bio.Alphabet模块中定义。»

问题的原因很简单,就是
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
12.4826178327 seconds
0.228640588399 seconds

编辑 我已经理解了我的问题:我在代码中使用了'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'
结果

len(records) == 165

>154995,168481 :
0000000000001000000010000100000001000000000000000
>123031,74772 :
0000000000001111000101100011100000100010000000000
>176816,178586,80016 :
0100000000000010010010000010110011100000000000000
>129575,45329 :
0100000000101101100000101110001000000100000000000

Number of unique occurences : 156
12.4826178327 seconds
0.228640588399 seconds

比率=55

凯文·雅各布斯在前一个问题中使用的代码使用了类型为
Seq
的序列

«本质上是像AGTACACTGGT这样的字母串,看起来非常复杂 自然,因为这是序列在图像中最常见的方式 生物文件格式。»

«对象和标准之间有两个重要区别 Python字符串。(……)

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

其次,Seq对象具有重要的 属性
字母表
,它是一个对象,用于描述个体 组成序列字符串“mean”的字符,以及它们应该如何 被解释。例如,AGTAACTGGT是一个DNA序列,还是仅仅是一个DNA序列 富含丙氨酸,甘氨酸, 半胱氨酸和苏氨酸

字母表对象可能是使
Seq

对象不仅仅是字符串当前可用的字母表 Biopython在Bio.Alphabet模块中定义。»

问题的原因很简单,就是
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
12.4826178327 seconds
0.228640588399 seconds

编辑 我已经理解了我的问题:我在代码中使用了'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'
结果

len(records) == 165

>154995,168481 :
0000000000001000000010000100000001000000000000000
>123031,74772 :
0000000000001111000101100011100000100010000000000
>176816,178586,80016 :
0100000000000010010010000010110011100000000000000
>129575,45329 :
0100000000101101100000101110001000000100000000000

Number of unique occurences : 156
12.4826178327 seconds
0.228640588399 seconds

比率=55

你能在你的问题中显示PYHLIP文件的开头吗?特别是第一行,我提供了一个到对齐文件的链接。我将编辑我的问题并写在phylip文件的前面。很有趣。。。在你的档案中有两件事我觉得很奇怪。首先,您的标识符是数字的(不要以字母开头),其次您的序列也是数字的(不是DNA或蛋白质)。您能在问题中显示PYHLIP文件的(开头)吗?特别是第一行,我提供了一个到对齐文件的链接。我将编辑我的问题并写在phylip文件的前面。很有趣。。。在你的档案中有两件事我觉得很奇怪。首先,您的标识符是数字的(不要以字母开头),其次,您的序列也是数字的(不是DNA或蛋白质)。基本错误。。我想我已经核实过了,显然不是..谢谢。。关于你之前的评论。通常,样本有一个数字代码,