我正在尝试从基因组文件中循环显示特定行中的两列(前50行在bam.txt
下面)并输出这些列之间的值(即,如果第1行是5000-7000并且行2是9000-10000,我想要新的字典中的7001-8999)。我通过计算列之间的距离,将其添加到第一个值,然后从下一行的值中减去一个来设置它。我已经阅读了文档和类似的问题,但file.next()的变体仍在从同一行中提取值。
https://www.dropbox.com/s/4gjbgrjtdafngev/bam.txt
import re
from collections import OrderedDict
infile=open('bam.txt', 'r')
intronic={}
exonic={}
intron=0
for line in infile:
if (line[0] != '#') and re.search("exon", line):
eee = re.split('\t', line)
exonF = eee[3]
exonR = eee[4]
exonic=OrderedDict()
exonic[exonF]=exonR
for value,key in exonic.iteritems():
intronsize=int(key)-int(value)
intronF=int(value) + intronsize + 1
##line=line.next()## <-------- jump to next line here
intronR=int(value)-1
intronic=OrderedDict()
intronic[intronF]=intronR
print intronic
答案 0 :(得分:0)
next()
是file
的一种方法:http://docs.python.org/2.7/library/stdtypes.html#bltin-file-objects
您致电infile.next()
以阅读该文件的下一行。正如Bakuriu所指出的,与python3的兼容性建议使用next(infile)
代替(虽然在python2中具有相同的效果)。
正如文件所说,
文件对象是它自己的迭代器
在您的情况下,文件对象上的for
循环在行上迭代,在每个循环中隐式调用next()
。
答案 1 :(得分:0)
我真的没有得到你想要达到的目标,但是......
每次循环时,exonic
都会被重新创建为新的空字典,因此下一循环中的intronic
也是如此。
iteritems()
会返回key, value
而不是您正在撰写的value, key
。
我认为你可以使用列表而不是OrderedDicts。
这里不需要正则表达式。
这与我正在做的大概相同,一个是通过文件来获取行,然后是另一个遍历行跟踪前一行以计算行之间的差异:< / p>
from collections import OrderedDict
infile = open('bam.txt', 'r')
intron=0
line_results = []
for line in infile:
if not line.startswith('#') and 'exon' not in line:
eee = line.split('\t')
exonF = int(eee[3])
exonR = int(eee[4])
line_results.append(exonF, exonR))
prev_line = (0,0)
for line in line_results:
exonF, exonR = line
prev_exonF, prev_exonR = prev_line
intron_size = exonR - exonF
intronF = prev_intronR + 1
intronR = exonF + intronsize + 1 #I don't know if this is what you want
print intronF, intronR, intron_size
prev_line = line