2014-11-17 2 views
0

Я пытаюсь написать скрипт python, который принимает данные из текстового файла, получает строки между двумя строками, включая первую строку, и использует извлеченные данные в другой функции.Возврат не возвращающий полные данные 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 
table y n y 
others rgg grgr grgr 

Я хочу

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

Запуск только первая функция печатает, но при использовании его второй функции, я получаю только

title A B F 

Как я могу это исправить? Где я иду не так?

ответ

0

Две точки:

Во-первых, data это значение, которая постоянно обновляется, как вы итерацию name. Эта переменная (если вы не переопределите ее в своем цикле, которой вы не должны) всегда будет определяться как строка, которую вы сейчас читаете, от name, поэтому возврат data всегда будет возвращать только одну строку.

Во-вторых, то, как вы используете свой if-elif условный, кажется немного странным. elif будет оцениваться только в том случае, если все предыдущие и elif операторы были оценены как ложные, поэтому никогда не будет итерации, где 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 хотите - просто скопируйте его в свою строку, если это так. Я также изменил это, чтобы вы передали список разрешенных заголовков, на всякий случай, если вы хотите повторно использовать его, чтобы получить только title и date или любую другую комбинацию.

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 

Резюме:

Вы должны возвратить данные после того, как вы покинете для петли разумным способом. Также помните, что вы получаете copy = False, как только вы вводите функцию, которая, вероятно, сейчас не имеет значения, но просто вежливое напоминание о любом будущем расширении, которое вы делаете с этим методом.

0

Это будет трюк, хотя, вероятно, есть более эффективные способы его решения. Как утверждалось, выражение if-else не использовалось должным образом, и я добавил переменную результата для хранения временного значения.

def Extracted_data(name): 
    copy = False 
    result = "" 
    for data in name: 
     if (data.startswith ("title") or data.startswith ("date") or data.startswith ("time") or data.startswith ("table")): 
      copy = True 
     else: 
      copy = False 

     if copy and not data is None: 
      result += data 

    return result 

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

a() 
+0

если data.startswith ("Таблица") копия будет ложной - проверьте код OP. – ha9u63ar

+0

Согласен, только в ожидаемой выходной таблице. Вот почему он включен в список. –

+0

@RikVerbeek Мой плохой! Прости. Это моя ошибка. Спасибо за код. Я попробую это :) – abn

Смежные вопросы