[Tutor] Log file for Nested if-elif

Steven D'Aprano steve at pearwood.info
Wed Jan 2 23:16:45 EST 2019


On Wed, Jan 02, 2019 at 08:39:53PM +0530, Asad wrote:
> Hi All ,
> 
> Need advice on the following piece of code :

Let me write it in a more "Pythonic" style:



PATCH = r'\?/patch/\d{8}/\d{8}/admin/load.sql'
APPLY = r'Starting\s+apply\s+for\s+patch\s+\d{8}/\d{8}'
ERROR = r'set_metadata'

tail = deque(maxlen=8)  # the last eight lines
script = None
with open("file1.log", 'r') as f:
    for line in f:
        tail.append(line)
        if (re.search(PATCH, line, re.IGNORECASE) 
                or re.search(APPLY, line, re.IGNORECASE):
            script = line
        elif re.search(ERROR, line, re.IGNORECASE):
             print "Reason for error \n", line
             print "Script:", script
             print "Tail:\n", tail
             print " Danger "  # Seriously? This is dangerous?
             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

Where are you looking? *Anywhere* in the log file? Only in the 
immediate next line? Anywhere forward of the "patch" line? You are 
looking for two patterns, but does the order they appear, or the 
distance apart, matter?


blah blah blah set_metadata blah blah
... 100 lines ...
blah blah blah /patch/ ... admin/load.sql
... 100 lines ...

Is that a match?

> print last 4 lines of the tail array  and exit

    print tail[-4:]
    sys.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

This is a contradiction: you just said that it DOESN'T match the 
patch...load.sql pattern, but now you want it to print the line that 
matched. There is no line that matches!

> 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 need to tighten the specifications to make it more clear what you 
are trying to do.



-- 
Steve


More information about the Tutor mailing list