Asad wrote: > Hi All , > > Need advice on the following piece of code : > > with open(r"file1.log", 'r') as f: > tail = deque(maxlen=8) # the last eight lines > script = None > for line in f: > tail.append(line) > if > re.search('\?/patch/\d{8}/\d{8}/admin/load.sql',line,re.IGNORECASE): > script = line > elif re.search(r'Starting\s+apply\s+for\s+patch\s+\d{8}/\d{8}', > line, re.IGNORECASE): > script = line > elif re.search(r'set_metadata', line ,re.IGNORECASE) is not None: > print "Reason of error \n", tail[-1] > print "Script:\n", script > print "Block of code:\n" > for item in tail: > print item > print " Danger " > break > Now this is printing the last cached line in the variable line . However > I would like to see the following output : > > 1) if it matches the pattern: \?/patch/\d{8}/\d{8}/admin/load.sql then > > look for the line "set_metadata" in the file1.log if it finds the pattern > then print the line which matches the pattern > \?/patch/\d{8}/\d{8}/admin/load.sql > > print last 4 lines of the tail array and exit > > 2) if it doesnot match '\?/patch/\d{8}/\d{8}/admin/load.sql' > > then look of the anothern pattern > :Starting\s+apply\s+for\s+patch\s+\d{8}/\d{8} if it find the pattern > > then look for line "set_metadata" in the file1.log if it finds the > pattern then print the line which matches the pattern > \?/patch/\d{8}/\d{8}/admin/load.sql > > print all the lines in tail > > print a recommendation "Please check the installation" > > > 3 ) if it doesnot match the pattern: \?/patch/\d{8}/\d{8}/admin/load.sql > or '\?/patch/\d{8}/\d{8}/admin/load.sql' > > print "No match found refer to install guide" > > Can you advice what I can do to change the code .
You have "nested" in the subject, do not make an attempt to structure your loop. Why is that? In my experience using lots of small functions makes code easier to understand. Below is a suggestion how you might break up your code. # untested; expect a few bugs! def with_tail(items, maxlen): tail = deque(maxlen=maxlen) def gen_items(): for item in items: tail.append(item) yield item return tail, gen_items() def search_end_of_section(lines): for line in lines: if re.search(r'set_metadata', line, re.IGNORECASE) is not None: break else: raise ValueError("Reached end of file...panic!") def dump(script, tail, advice=None): print "Reason of error \n", tail[-1] print "Script:\n", script print "Block of code:\n" for item in tail[-limit:]: print item print " Danger " if advice is not None: print advice RE_PATCH = re.compile(r'\?/patch/\d{8}/\d{8}/admin/load.sql', re.IGNORECASE) RE_APPLY = re.compile( r'Starting\s+apply\s+for\s+patch\s+\d{8}/\d{8}', re.IGNORECASE ) with open(r"file1.log", 'r') as f: tail, lines = with_tail(f) for line in lines: if RE_PATCH.search(line) is not None: search_end_of_section(lines) dump(script=line, tail=tail[-4:]) break elif RE_APPLY.search(line) is not None: search_end_of_section(lines) dump( script=line, tail=tail, advice="Please check the installation" ) break _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: https://mail.python.org/mailman/listinfo/tutor