[Tutor] Log file for Nested if-elif

Peter Otten __peter__ at web.de
Thu Jan 3 06:11:08 EST 2019


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




More information about the Tutor mailing list