如何保存文件中的行数据,直到稍后在文件python中遇到条件

时间:2014-12-05 19:34:42

标签: python file-handling

我怀疑这是一个重复的问题,但我已经搜索了一段时间,似乎没有正确的措辞来找到这个问题的答案。对不起,如果提前重复!

我正在尝试从我正在逐行阅读的文件中打印以下信息。

基因-1基因-2基因0 *基因1基因2

*在代码中称为ncRNA基因

我已经能够得到gene0,gene1,gene2,但是我无法弄清楚如何缓冲基因-1和基因-2直到条件基因0(数据[2] = ncRNA)得到满足。

换句话说,我需要从前一行获得可变信息,但仅在满足当前行中的条件时才需要。我在下面的注释部分中已经考虑过了,但似乎必须有更好的方法来做到这一点(这将是一个嵌套的混乱)。我正在浏览的文件是一个gff文件。

我不知道如何为以前的信息制作占位符'直到条件满足。

import sys
import re
gff3 = sys.argv[1]
f = open(gff3, 'r')

ncRNAgene= False
fgene_count=0

while True:
    line = f.readline()
    if not line.startswith('#'):
        data = line.strip().split("\t")
        ### this is not important to the question, just me dealing with the file format
        try:
            #my mis-guided attempts to get at this issue
            #if data[2] == gene:
            #line0 = f.readline()
            #data0 = line.strip().split("\t")
            #if data0[2] == gene


        ### the relevant information is in the third column of the line
            if data[2] == 'ncRNA':
                ncRNAgene = True

                print "ncRNA gene:", line

                while fgene_count <= 1 and ncRNAgene:
                    line = f.readline()
                    data2 = line.strip().split("\t")
                    if data2[2] == 'gene':
                        fgene_count = fgene_count + 1

                        print "this is gene %s : %s" %(fgene_count, line)

            if fgene_count > 1:
                fgene_count = 0
                ncRNAgene= False

            else:
                continue

    except IndexError:
            if line.startswith('>'):
                break
    if not line:
        break

f.close()

这就是我感兴趣的文件的一部分:我把括号放在我感兴趣的东西周围。

  

211000022279165 FlyBase [exon] 14 1118。 - 。父= FBtr0300167; PARENT_TYPE = ncRNA的

     

211000022279165 FlyBase [基因] 14 1118。 - 。 ID = FBgn0259870;名称=苏(STE):CR42439;全名=苏(STE):CR42439; ALIAS = CR42439; Ontology_term = SO:0000011,SO:0000087; Dbxref = FlyBase_Annotation_IDs:CR42439,EntrezGene:7354392,GenomeRNAi:7354392 < / p>      

211000022279165 FlyBase [ncRNA] 14 1118。 - 。 ID = FBtr0300167;名称= Su(Ste):CR42439-RA;父= FBgn0259870;别名= CR42439-RA; Dbxref = FlyBase_Annotation_IDs:CR42439-RA,REFSEQ:NR_026633; score_text =弱支持;得分= 0

1 个答案:

答案 0 :(得分:1)

很难确切地说出你的意思,但是像这样的问题的一般想法非常简单:只需将gene1gene2存储在您更新的本地变量中找到gene1gene2行,然后在找到gene0行时使用这些局部变量。

例如:

gene1, gene2 = None, None
for line in file:
    if matches_gene1(line):
        gene1 = parse_gene1(line)
    elif matches_gene2(line):
        gene2 = parse_gene2(line)
    elif matches_gene0(line):
        gene0 = parse_gene0(line)
        do_stuff_with(gene0, gene1, gene2)
        gene1, gene2 = None, None

或者,如果在每个gene1之前可以有多个 gene2gene0行,只需使用它们的列表:

gene1, gene2 = [], []
for line in file:
    if matches_gene1(line):
        gene1.append(parse_gene1(line))
    elif matches_gene2(line):
        gene2.append(parse_gene2(line))
    elif matches_gene0(line):
        gene0 = parse_gene0(line)
        do_stuff_with(gene0, gene1, gene2)
        gene1, gene2 = [], []