2014-12-05 3 views
0

이 질문은 반복되는 것으로 판단됩니다.하지만 잠시 동안 검색 한 결과 문안을 찾을 수있는 권리가없는 것 같습니다. 미안, 그것이 미리 반복되면!나중에 파일 python에서 조건이 충족 될 때까지 파일의 행에서 데이터를 유지하는 방법

나는 한 줄씩 읽는 파일에서 다음 정보를 인쇄하려고합니다.

gene1의 gene2 유전자 0 * gene1 gene2

내가 gene0, gene1, gene2을 얻을 수 있었다

코드에서 ncRNA 유전자라고

*,하지만 난 문제가 노력을 데 조건 유전자 0 (data [2] = ncRNA)이 충족 될 때까지 gene-1과 gene-2를 어떻게 완충하는지 알아 내야한다.

즉, 이전 줄의 변수 정보가 필요하지만 현재 줄의 조건이 충족 될 때만 필요합니다. 나는 아래의 주석 처리 된 부분에서 그것에 대해 생각해 봤지만 더 좋은 방법이 있어야 할 것 같습니다 (중첩 된 엉망이 될 것입니다). 내가보고있는 파일은 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 [엑손] (14) 1118.. -. 부모 = FBtr0300167; parent_type = ncRNA

211000022279165 FlyBase [유전자] 14 1118. -. CR42439, Alias ​​= CR42439, Ontology_term = SO : 0000087, Dbxref = FlyBase_Annotation_IDs : CR42439, EntrezGene : 7354392, GenomeRNAi : 7354392

(ID = FBgn0259870)

211000022279165 FlyBase [ncRNA] 14 1118. -. ID = FBtr0300167; NAME = 쓰 (인트) CR42439-RA, 부모 = FBgn0259870; 별칭 = CR42439-RA, Dbxref = FlyBase_Annotation_IDs : CR42439-RA, 나온 RefSeq : NR_026633는, score_text 약하게 지원 = 스코어 = 0

+0

이 실제 들여 쓰기인가? 그로 인해 야기되는 많은 문제가 있기 때문에 먼저 해결해야합니다. 행이'#'으로 시작하더라도'data '를 사용하려고하는 코드가 있습니다. 이는 이전 행의'data'를 다시 사용한다는 것을 의미합니다. 'else'가'if'보다는'try'와 일치하는 것처럼 보이는데, 이것은 아무 의미도 없습니다. 등등. – abarnert

+2

한편, 당신의 설명에서 당신이 원하는 것이 분명하지 않습니다. 설명에서 '유전자 -1'과 '유전자 -2'는 무엇입니까? – abarnert

+0

의견을 보내 주셔서 감사합니다. 주석 처리 된 섹션은 실제 들여 쓰기가 아니며 나머지 부분을 해결할 수 있는지 확인합니다. 죄송합니다 어떤 유전자 1과 유전자 2가 명확하지 않습니다. 기본적으로 ncRNA (또는 gene0)를 둘러싸고있는 영역에 대한 '유전자'정보를 찾으려고합니다. – wubbina

답변

1

정확히 무엇을 의미하는지 알기는 어렵지만 이와 같은 문제에 대한 일반적인 아이디어는 매우 간단합니다. gene1gene2gene1 또는 gene2 행을 찾을 때마다 업데이트하는 로컬 변수에 저장 한 다음 gene0 행을 찾으십시오. 예를 들어

: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, 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 = [], []