2014-10-13 2 views
1

입력 :구문 분석 발전기 파이썬 2

@example1 
abcd 
efg 
hijklmnopq 
@example2 
123456789 

스크립트 :

def parser_function(f): 
    name = '' 
    body = '' 
    for line in f: 
     if len(line) >= 1: 
      if line[0] == '@': 
       name = line 
       continue 
      body = body + line 
      yield name,''.join(body) 

for line in parser_function(data_file): 
    print line 

출력

('@example1', 'abcd') 
('@example1', 'abcdefg') 
('@example1', 'abcdefghijklmnopq') 
('@example2', 'abcdefghijklmnopq123456789') 

원하는 출력 :

('@example1', 'abcdefghijklmnopq') 
('@example2', '123456789') 

내 홍보 oblem, 내 발전기는 모든 라인을 굴복하고 있지만 라인을 재설정 해야할지는 잘 모르겠습니다. 원하는 출력을 얻는 데 문제가 있으며 몇 가지 방법을 시도했습니다. 어떤 도움이라도 대단히 감사하겠습니다. "if name :"을 가진 다른 발전기를 보았지만 상당히 복잡했습니다. 나는 그 코드를 사용하여 작업 할 수있어하지만 난 당신이 어디를 yield 변경해야

답변

4

가능한 내 코드는 작게 만들려고 노력 해요 :

def parser_function(f): 
    name = None 
    body = ''  
    for line in f: 
     if line and line[0] == '@': 
      if name: 
       yield name, body 
      name = line 
     else: 
      body += line 
    if name: 
     yield name, body 

yield들마다 @... 전에 한 번에 끝.

P. built-in을 음영 처리하지 않으려면 strbody으로 변경했습니다.

+0

변수 이름으로'str'을 사용하지 말 것을 지적 할 가치가 있습니다. –

+0

@PadraicCunningham : 좋은 지적입니다. 답변에 추가하겠습니다. 감사. – NPE

+0

"if line and line [0] == '@'"나는 라인 [0]을 이해하지만 "if line"은 항상 참이 아니겠습니까? –