我正在尝试与previous question做类似的事情 我的目的是加入所有相同的序列。但这次不是字母,而是数字。
可以找到 问题是当我尝试这样做时: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解释为一个数字,因为它是一个字符串..
有什么想法吗?
谢谢!
答案 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模块中定义。»
问题的原因只是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!