Получить номер строки определенной фразы в файле Python

Мне нужно получить номер строки фразы в текстовом файле. Фраза может быть:

the dog barked

Мне нужно открыть файл, найти его по этой фразе и напечатать номер строки.

Я использую Python 2.6 на Windows XP


Это то, что у меня есть:

o = open("C:/file.txt")
j = o.read()
if "the dog barked" in j:
     print "Found It"
else:
     print "Couldn't Find It"

Это не домашняя работа, это часть проекта, над которым я работаю. Я даже понятия не имею, как получить номер строки.

11 ответов

Решение
lookup = 'the dog barked'

with open(filename) as myFile:
    for num, line in enumerate(myFile, 1):
        if lookup in line:
            print 'found at line:', num
f = open('some_file.txt','r')
line_num = 0
search_phrase = "the dog barked"
for line in f.readlines():
    line_num += 1
    if line.find(search_phrase) >= 0:
        print line_num

РЕДАКТИРОВАТЬ 1,5 года спустя (увидев, что это получит еще один голос): я оставляю это как есть; но если бы я писал сегодня, то написал бы что-то более близкое к решению Эша / Сюзаншакьи:

def line_num_for_phrase_in_file(phrase='the dog barked', filename='file.txt')
    with open(filename,'r') as f:
        for (i, line) in enumerate(f):
            if phrase in line:
                return i
    return -1
  • С помощью with открыть файлы - это иероглиф питона - он гарантирует, что файл будет правильно закрыт, когда блок, использующий файл, закончится.
  • Итерация по файлу с помощью for line in f намного лучше чем for line in f.readlines(), Первый является питоническим (например, будет работать, если f любой универсальный итеративный; не обязательно файловый объект, который реализует readlines) и более эффективно f.readlines() создает список со всем файлом в памяти, а затем перебирает его. * if search_phrase in line более питонна, чем if line.find(search_phrase) >= 0так как не требует line реализовать find, легче читать, чтобы увидеть, что задумано, и не так легко облажаться (например, if line.find(search_phrase) а также if line.find(search_phrase) > 0 оба не будут работать для всех случаев, так как find возвращает индекс первого совпадения или -1).
  • Проще / чище обернуть повторяющийся элемент в enumerate лайк for i, line in enumerate(f) чем инициализировать line_num = 0 до цикла, а затем вручную увеличить в цикле. (Хотя, возможно, это труднее читать людям, незнакомым с enumerate.)

Смотрите код как pythonista

def get_line_number(phrase, file_name):
    with open(file_name) as f:
        for i, line in enumerate(f, 1):
            if phrase in line:
                return i

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

lookup="The_String_You're_Searching"
file_name = open("file.txt")
for num, line in enumerate(file_name,1):
        if lookup in line:
            print(num)

Откройте свой файл, а затем сделайте что-то вроде...

for line in f:
    nlines += 1
    if (line.find(phrase) >= 0):
        print "Its here.", nlines

Существует множество способов чтения строк из файлов в Python, но for line in f Техника более эффективна, чем большинство.

list = open("file_name","mode")

if "search element" in list:
    print list.index("search element")  # This will gives you the line number

Вы можете использовать понимание списка:

content = open("path/to/file.txt").readlines()

lookup = 'the dog barked'

lines = [line_num for line_num, line_content in enumerate(content) if lookup in line_content]

print(lines)

Вот что я нашел для работы:

f_rd = open(path, 'r')
file_lines = f_rd.readlines()
f_rd.close()

matches = [line for line in file_lines if "chars of Interest" in line]
index = file_lines.index(matches[0])

Однострочное решение:

      l_num = open(file).read()[:open(file).read().index(phrase)].count('\n') + 1

и более безопасная версия ввода-вывода:

      l_num = (h.close() or ((f := open(file, 'r', encoding='utf-8')).read()[:(f.close() or (g := open(file, 'r', encoding='utf-8')).read().index(phrase))].count('\n') + (g.close() or 1))) if phrase in (h := open(file, 'r', encoding='utf-8')).read() else None

Объяснять:

      file = 'file.txt'
phrase = 'search phrase'
with open(file, 'r', encoding='utf-8') as f:
    text = f.read()
    if phrase in text:
        phrase_index = text.index(phrase)
        l_num = text[:phrase_index].count('\n') + 1  # Nth line has n-1 '\n's before
    else:
        l_num = None
for n,line in enumerate(open("file")):
    if "pattern" in line: print n+1

Прошло много времени с тех пор, как это было опубликовано, но вот изящная строчка. Наверное, не стоит головной боли, а просто для удовольствия :)

      from functools import reduce 
from pathlib import Path

my_lines       = Path('path_to_file').read_text().splitlines()       
found, linenum = reduce(lambda a, b: a if a[0] else (True, a[1]) if testid in b else (False, a[1]+1), [(False,0)] + my_lines)
            
print(my_lines[linenum]) if found else print(f"Couldn't find {my_str}")

Обратите внимание, что если в файле два экземпляра, он

Другие вопросы по тегам