2014-11-17 12 views
0

텍스트 파일에서 데이터를 가져 와서 첫 번째 문자열을 포함한 두 문자열 사이에 행을 가져오고 다른 함수에서 추출한 데이터를 사용하는 python 스크립트를 작성하려고합니다.반환하지 않음 전체 데이터 파이썬

def Extracted_data(name): 
    copy = False 
    for data in name: 
     if data.startswith ("title"): 
      copy = True 
     elif data.startswith ("table"): 
      copy = False 
     elif copy: 
      return data 

name = open ("file.txt").readlines() 
def a(): 
    data = Extracted_data(name) 
    print data 

a() 

이것은 전체 데이터를 인쇄하지 않습니다. 첫 번째 행만 인쇄합니다. 샘플 데이터는 다음과 같습니다. 탭으로 구분 된 텍스트 파일입니다. 두 번째 기능을 사용할 때 내가 첫 번째 기능 인쇄를 실행

title A B F 
date 23 24 12 
time 1 2 5 

을 원하는

title A B F 
date 23 24 12 
time 1 2 5 
table y n y 
others rgg grgr grgr 

이 있지만, 나는 단지

나는이 문제를 해결할 수있는 방법
title A B F 

를 얻을? 내가 어디로 잘못 가고 있니?

답변

0

두 점 :

첫째, dataname 반복으로 지속적으로 업데이트되고있는 값입니다. 이 변수는 루프에서 다시 정의하지 않는 한 현재 사용하고있는 행으로 항상 정의되어 있으므로 data을 반환하면 항상 한 행만 반환됩니다.

둘째, if-elif 조건을 사용하는 방식이 약간 이상하게 보입니다. elif은 이전의 모든 ifelif 문이 false로 평가 된 경우에만 평가되므로 copy이 true로 설정되고 data이 반환되는 반복이 절대 없을 것입니다. 이는 해당 행 중 하나만 실행할 수 있기 때문에 가능합니다.

"첫 번째 기능"이 예상 한 것을 인쇄하는 이유는 확실하지 않습니다. Extracted_data을 가정 할 때, 그 방법 중에 아무 곳에서나 print 기능이 없기 때문에 놀랍습니다. 이 일을 더 나은 방법이 될 수처럼

는하지만, 이것은 보이는 것 같다 당신은 뒤에있는 것처럼 :

def Extracted_data(name, permitted_headers): 
    result = "" 
    for data in name: 
     for header in permitted_headers: 
      if not data is None and data.startswith(header): 
       result += data 
       break 

    return result 

헤더가 하나인지 여부를 확인하는 이유가 없어야합니다 당신 돈 ' t want - 문자열 인 경우 문자열에 복사하십시오. 또한 허용 된 헤더 목록을 전달하도록 수정했습니다. 단지 재사용하여 titledate 또는 그 외 다른 조합 만 얻으려는 경우에 대비하여 사용할 수 있습니다. 코드에서 내 의견에

0

봐 :

def Extracted_data(name): 
    copy = False # This will false all the time you enter the function 
    for data in name: 
     if data.startswith ("title"): 
      copy = True 
     elif data.startswith ("table"): 
      copy = False 
     elif copy: # May be "else:"? because you want this if everything else is false 
      return data # what will you return after for loop? 

나는 코드의 일부 장식을 할 경우

def Extracted_data(name): 
    copy = False 
    res_data = ""; # This will build a data string 
    for data in name: 
     if not (data.startswith ("title")): # As you wanted nothing except title data 
      copy = False    
     else:        # It will only get "title" 
      copy = True 
      res_data += data    # And append it to the result 
    return res_data 

요약 : 당신은 당신이 떠날 후 데이터를 반환 할 필요가

for 루프는 합리적인 방법으로 또한 함수를 입력하자마자 copy = False을 얻는다는 것을 기억하십시오 - 아마도 지금은 문제가되지 않지만,이 방법으로 미래의 확장을 알리는 것은 단지 예의입니다.

0

아마도이 문제를 해결하는 더 좋은 방법이 있지만 트릭을 수행 할 것입니다. furkle이 언급했듯이 if-else 문은 제대로 사용되지 않았고 임시 값을 저장하기 위해 결과 변수를 추가했습니다.

+0

data.startswith ("Table") 사본이 거짓 일 경우 - OP 코드를 확인하십시오. – ha9u63ar

+0

동의합니다. 예상 출력 표에만 포함되어 있습니다. 그것이 목록에 포함 된 이유입니다. –

+0

@RikVerbeek 나쁘다! 죄송 해요. 그게 내 실수 야. 코드를 보내 주셔서 감사합니다. 나는 그것을 밖으로 시도 할 것이다 :) – abn

관련 문제