I need to get the line number of a phrase in a text file. The phrase could be:
the dog barked
I need to open the file, search it for that phrase and print the line number.
I’m using Python 2.6 on Windows XP
This Is What I Have:
o = open("C:/file.txt") j = o.read() if "the dog barked" in j: print "Found It" else: print "Couldn't Find It"
This is not homework, it is part of a project I am working on. I don’t even have a clue how to get the line number.
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
EDIT 1.5 years later (after seeing it get another upvote): I’m leaving this as is; but if I was writing today would write something closer to Ash/suzanshakya’s solution:
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
withto open files is the pythonic idiom — it ensures the file will be properly closed when the block using the file ends.
- Iterating through a file using
for line in fis much better than
for line in f.readlines(). The former is pythonic (e.g., would work if
fis any generic iterable; not necessarily a file object that implements
readlines), and more efficient
f.readlines()creates an list with the entire file in memory and then iterates through it. *
if search_phrase in lineis more pythonic than
if line.find(search_phrase) >= 0, as it doesn’t require
find, reads more easily to see what’s intended, and isn’t easily screwed up (e.g.,
if line.find(search_phrase) > 0both will not work for all cases as find returns the index of the first match or -1).
- Its simpler/cleaner to wrap an iterated item in
for i, line in enumerate(f)than to initialize
line_num = 0before the loop and then manually increment in the loop. (Though arguably, this is more difficult to read for people unfamiliar with
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, I’m actually modifying your code, I think this will simplify the code, but make sure before running the code the file must be in the same directory of the console otherwise you’ll get error.
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)
Open your file, and then do something like…
for line in f: nlines += 1 if (line.find(phrase) >= 0): print "Its here.", nlines
There are numerous ways of reading lines from files in Python, but the
for line in f technique is more efficient than most.
listStr = open("file_name","mode") if "search element" in listStr: print listStr.index("search element") # This will gives you the line number
for n,line in enumerate(open("file")): if "pattern" in line: print n+1
Here’s what I’ve found to work:
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)