Writing to a File with Python — ”While not done:” Confusing Me

I have less than a year of programming experience. While learning about reading and writing files I came across this tutorial: http://www.penzilla.net/tutorials/python/fileio/

The tutorial offers the following example as a simple script to create and write to a file:

# Let's create a file and write it to disk.
filename = "test.dat"
# Let's create some data:
done = 0
namelist = []
while not done:
    name = raw_input("Enter a name:")
    if type(name) == type(""):
        namelist.append(name)
    else:
        break

# Create a file object:
# in "write" mode
FILE = open(filename,"w")

# Write all the lines at once:
FILE.writelines(namelist)

# Alternatively write them one by one:
for name in namelist:
    FILE.write(name)

FILE.close()  

I copied this code and ran it through a Python 2.7.3 Shell. I am prompted repeatedly to enter strings which are appended to a list that will be written to a file (this makes sense to me). What I don’t understand is the condition for exiting the While loop (“While not done:”). I thought this meant that I type done at the prompt to exit the loop and subsequently write the file, but done has no effect. Then I thought that any non-string entered at the prompt should break the loop and write the file. I couldn’t get the loop to break at all; for anything I entered at the prompt, I was just prompted again with “Enter a name:”.

By removing the While loop and retaining the if/else statement, I got the code to work for a single prompt. Can someone tell me what I am not understanding here? I am guessing it is a fairly simple concept that wasn’t explained in the tutorial because it was assumed to be obvious. Since “done” is such a common word, I wasn’t able to find any Python specific meanings for it.

Best answer

done is assigned once on line 3:

done = 0

Therefore, this the while loop will continue to loop as long as done is still “not 0”:

while not done:

I.e. it will continue to loop forever, unless it hits a break statement (line 11). Unfortunately, the code is flawed and that will never happen.

If you want to stop when you type ‘done’, then change the if statement to:

if name == "done":

But, be aware that the literal string done above has nothing to do with the variable done assigned earlier.