在迭代器循环中添加next.line()样式参数

时间:2014-03-19 19:01:13

标签: python iterator

我正在尝试从基因组文件中循环显示特定行中的两列(前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

2 个答案:

答案 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