2016-01-18 2 views
0

То, что я до сих пор:Как выводить каждую строку в файл, который содержит любой из строк в списке

def FileSearch(filename, items): 
    try: 
     filehandle = open(filename, "r") 
     linenumber = 0 
     for line in filename: 
      linenumber +=1 
      for item in items: 
       if item in line: 
        print("%2i - %s" %(linenumber, line), end="") 
    except IOError: 
     print("Error file cannot be read or file does not exist") 
     print("Please try again") 

Я пытаюсь напечатать строки, предшествовавшие их LINENUMBER, которые содержат какой-либо из строки, содержащиеся в списке «элементы». Так что бы на выходе что-то вроде этого:

>>>FileSearch("textfile",["this","and","is"]) 
2 - this is the 2nd line 
4 - hello and goodbye 
5 - this is a very basic example 

Но когда я запускаю программу, я даже не получаю сообщение об ошибке, ничего не происходит, просто бежит к следующей строке. Буду признателен за любую помощь. Мне также интересно, был ли способ распечатать строки в числовом порядке или программа сама сделала бы это здесь?

+0

Вы хотите линии, где более чем один матч будет найден, чтобы быть напечатаны более одного раза? – M4rtini

+0

Нет, я не хочу дубликатов – DecafOyster208

ответ

4

Вы не получаете результат, ни ошибку, потому что вы выполняете итерацию не по строкам файла, а скорее по символам filename. Измените эту строку:

for line in filename: 

Для этого:

for line in filehandle: 
+0

Это сработало! спасибо, но он выводит дубликаты, как бы я их избегал? – DecafOyster208

+0

@ DecafOyster208 вывод в вашем примере «дублирует», потому что ваши «элементы» содержат две строки ('this' и' is'), которые находятся в строке 2 и строке 5. Если вы запускаете свою функцию следующим образом: 'FileSearch ("textfile", ["this", "and"]) ', вы увидите, что это не дублирование. Но если вы хотите остановить цикл после первого совпадения, просто добавьте 'break' после' print ("% 2i -% s"% (linenumber, line), end = "") 'statement. – vrs

+0

спасибо очень много! – DecafOyster208