[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