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或蛋白质)。基本错误。。我想我已经核实过了,显然不是..谢谢。。关于你之前的评论。通常,样本有一个数字代码,