Получить номер строки определенной фразы в файле 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}")
Обратите внимание, что если в файле два экземпляра, он