Получить номер строки определенной фразы в файле Python - PullRequest
46 голосов
/ 18 октября 2010

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

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"

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

Ответы [ 8 ]

85 голосов
/ 18 октября 2010
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
7 голосов
/ 18 октября 2010
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 для открытия файлов - это иероглиф pythonic - он гарантирует, что файл будет правильно закрыт, когда блок, использующий файл, закончится.
  • Итерация по файлу с использованием for line in f намного лучше, чем for line in f.readlines(). Первый является pythonic (например, будет работать, если f является любой универсальной итерируемой; не обязательно файловый объект, который реализует readlines), а более эффективный f.readlines() создает список со всем файлом в памяти, а затем выполняет итерацию по нему , * if search_phrase in line более питон, чем if line.find(search_phrase) >= 0, так как для реализации find не требуется line, легче читать, чтобы понять, что задумано, и его нелегко испортить (например, 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

5 голосов
/ 18 октября 2010
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
2 голосов
/ 16 января 2018

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)
1 голос
/ 13 ноября 2013
listStr = open("file_name","mode")

if "search element" in listStr:
    print listStr.index("search element")  # This will gives you the line number
1 голос
/ 18 октября 2010

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

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

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

0 голосов
/ 02 октября 2015

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

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])
0 голосов
/ 19 октября 2010
for n,line in enumerate(open("file")):
    if "pattern" in line: print n+1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...