我怀疑这是一个重复的问题,但我已经搜索了一段时间,似乎没有正确的措辞来找到这个问题的答案。对不起,如果提前重复!
我正在尝试从我正在逐行阅读的文件中打印以下信息。
基因-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
答案 0 :(得分:1)
很难确切地说出你的意思,但是像这样的问题的一般想法非常简单:只需将gene1
和gene2
存储在您更新的本地变量中找到gene1
或gene2
行,然后在找到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
之前可以有多个 gene2
和gene0
行,只需使用它们的列表:
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 = [], []