2013-04-06 2 views
0
while True: 
    try: 
     OpenFile=raw_input(str("Please enter a file name: ")) 
     infile=open(OpenFile,"r") 
     contents=infile.readlines() 
     infile.close() 

     user_input = raw_input(str("Enter A=<animal> for animal search or B=<where lives?> for place of living search: \n")) 
     if user_input.startswith("A="): 
      def find_animal(user_input,column): 
       return next(("\t".join(line) for line in contents 
          if line[column-1]==user_input),None) 
      find_animal(user_input[1:]) 
      print str((find_animal(user_input[1:], "WHO?"))) #"Who?" is the name of the first column. 

     else: 
      print "Unknown option!" 


    except IOError: 
     print "File with this name does not exist!" 

1.Введите имя животного.Функция поиска Python в файле с разделителями табуляции

2.Программа ищет строки, которые имеют это конкретное имя в первом столбце.

3.Программа печатает строки, которые имеют это имя в первом столбце.

Возможно, моя функция не работает должным образом. Не могли бы вы помочь мне найти ошибку? Спасибо!

EDIT

 def ask_for_filename(): 
     filename=str(raw_input("Please enter file name: ")) 
     return filename 

     def read_data(filename): 
     contents=open(filename,"r") 
     data=contents.read() 
     return data 

     def column_matches(line, substring, which_column): 
     for line in data: 
      if column_matches(line, substring, 0): 
       print line 
+0

Там нет необходимости называть 'Str()' на шнурке. – poke

ответ

0

Большие куски кода трудно читать и отлаживать, разделите свой код на более мелкие функции, например так:

def ask_for_filename(): 
    #left as an exercise 
    return filename 

def read_data(filename): 
    #left as an exercise 
    return data 

def column_matches(line, substring, which_column): 
    #left as an exercise 

def show_by_name(name, data): 
    for line in data: 
     if column_matches(line, name, 0): 
      print line 

def do_search(data): 
    propmt = "Enter A=<animal> for animal search or B=<where lives?> for place of living search: \n" 
    user_input = raw_input(prompt) 
    if user_input.startswith('A='): 
     show_by_name(user_input[2:], data) 

# main program 

filename = ask_for_filename() 
data = read_data(filename) 
while True: 
    do_search(data) 

Тестирование и отладка этих функций отдельно, пока вы не уверены, что они работают правильно. Затем напишите и протестируйте основную программу.

column_matches() должна возвращать верно, если какой-нибудь столбец (which_column) в line равно substring. Например, column_matches("foo\tbar\tbaz", "bar", 1) - True. Для достижения этой цели

  • разделить строку на разделитель - это дает нам список значений
  • получить п-й элемент списка
  • сравнить его с substing
  • возвращающие если они равно и ложь в противном случае

Собирает все вместе:

def column_matches(line, substring, which_column): 
    delimiter = '\t' 
    columns = line.split(delimiter) 
    value = columns[which_column] 
    if value == substring: 
     return True 
    else: 
     return False 

или, в более краткой и «вещей» форме:

def column_matches(line, substring, which_column): 
    return line.split('\t')[which_column] == substring 
+0

Благодарим за помощь. Я попытался выполнить упражнения, но я не могу понять, что мне нужно делать в третьей функции [см. Править]. Разве вы не можете объяснить, что мне там делать? – meowtwo

+0

@AlButter: Я добавил дополнительные сведения. – georg

+0

Благодарим вас за помощь, теперь я полностью понимаю, как правильно работать с функциями. Кстати, не могли бы вы посоветовать любые хорошие курсы python с тщательным пошаговым объяснением? – meowtwo

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