简体   繁体   中英

While loop break condition not working

I am trying to read a file, which will break when gets a line starting with "--------------------------" as:

#!/usr/bin/python3
def cinpt():
    with open("test", 'r') as finp:
        for line in finp:
            if line.strip().startswith("start"):
                while not line.startswith("---------------"):
                    sdata = finp.readline()
                    print(sdata.strip())

cinpt()

a demo input file( test ) is:

foo
barr
hii
start
some
unknown 
number 
of
line
-----------------------------
some 
more 
scrap

I am expecting the code to break after reading line "line" . The expected output is:

some
unknown 
number 
of
line

it takes start condition properly but not breaking at "----", instead goes to an infinite loop. What I am getting is:

some
scrap
line
-----------------------------
some
more
scrap

It loops forever because your line variable does not change during the while loop. You should iterate line by line, its simple.

#!/usr/bin/python3
def cinpt():
    with open("test", 'r') as finp:
        started = False
        for line in finp:
            if started:
                if line.startswith("---------------"):
                    break
                else:
                    print(line.strip())
            elif line.strip().startswith("start"):
                started = True

cinpt()

You should read the liens form your file in a single place As it is, you are fetching lines from your file both at for line in finp: line and at sdata = finp.readline() - this likely will be bad for you (as you have found out).

Keep your fiel data in a single place, and use auxiliar state variables to know how you should deal with that data. #!/usr/bin/python3

def cinpt():
    with open("test", 'r') as finp:
        inside_region_of_interest = False
        for line in finp:
            if line.strip().startswith("start"):
                inside_region_of_interest = True
            elif  line.startswith("---------------"):
                inside_region_of_interest = False
            elif inside_region_of_interest:
                sdata = line
                print(sdata.strip())

cinpt()

That said, your particular problem is that even though your while condition is on the line variable, you never modify that variable inside your while loop. Its content remains fixed at "start\\n" up to the end of the file.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM