[Tutor] function loading a file's lines to a list
Adriano Varoli Piazza
moranar at moranar.com.ar
Fri Apr 1 12:01:02 CEST 2005
I'm working on this coding assignment I had for a c++ class. For fun, I
decided to implement it in Python, and I'm done. Still, I found a
behaviour I can't explain:
The function loadfromfile
def loadfromfile(lines, fname):
try:
finput = file(fname, 'r')
lines = []
for line in finput:
line = line[:-1]
lines.append(line)
finput.close()
return lines
except:
print "Couldn't load from file %s" % (fname)
takes a file (referenced by fname) and appends each line of text in it
to a list called lines (a global var, see full code below).
Problem is, as soon as I leave the function, lines is empty. Even when
I'm returning it, non-empty. I tried putting a print statement just
before "return lines" and it shows the complete list (according to what
was in the file, obviously). But after that, the contents are emptied.
Modifying that function to
def loadfromfile(fname):
try:
finput = file(fname, 'r')
global lines
lines = []
for line in finput:
line = line[:-1]
lines.append(line)
finput.close()
#return lines
except:
print "Couldn't load from file %s" % (fname)
works (with or without the return lines statements, that's why I
commented it), but I don't understand why. I know lists are modified in-
place, so I'd imagine it would work in the first case too.
-------------------------------
Full code below:
#!/usr/bin/env python
# pysimpleditor: a concept - text editor
# Global vars:
lines = [] # Holds the lines of text in memory.
# Functions:
# insertline inserts text into lines _before_ the index linenumber.
def insertline(lines, linenumber):
try:
line = int(linenumber)
except:
print "not a valid line number"
text = raw_input("Input text: ")
lines.insert(line, text)
#deleteline deletes the line of text at lines[linenumber]
def deleteline(lines, linenumber):
try:
line = int(linenumber)
except:
print "not a valid line number"
lines.pop(line)
# Print the lines to the screen
def printlines(lines):
for line in lines:
print line
# Saves list lines to file fname.
def savetofile(lines, fname):
try:
foutput = file(fname, 'w')
for line in lines:
line = line + '\n'
foutput.write(line)
foutput.close()
except:
print "Couldn't open file %s for saving" % (fname)
# Loads text from fname into list lines.
def loadfromfile(fname):
try:
finput = file(fname, 'r')
global lines
lines = []
for line in finput:
line = line[:-1]
lines.append(line)
finput.close()
except:
print "Couldn't load from file %s" % (fname)
def printhelp():
print """
pysimpleeditor: A simple text editor.
Use:
In: inserts a line of text before line n.
En: deletes line n.
V: prints all lines on the screen.
S: saves the lines of text to a file.
C: loads text from a file.
H: this message.
F: exit the program.
"""
#The program:
while True:
choice = raw_input("Please enter a command (h for help): ")
choice = choice.upper() # Why bother the user with caps or uncaps?
if choice[0] == 'I': # Line addition
insertline(lines, choice[1:])
elif choice[0] == 'E': # Line deletion
deleteline(lines, choice[1:])
elif choice[0] == 'V': # Text visualization
for line in lines:
print line
elif choice[0] == 'S': # Save text to file
fname = raw_input("Enter a filename to save: ")
savetofile(lines, fname)
elif choice[0] == 'C': # Load text from file, _replaces_ list!
fname = raw_input("Enter a filename to load: ")
loadfromfile(fname)
elif choice[0] == 'H':
printhelp()
elif choice[0] == 'F': # Exits the program
break
else:
print "%s is not a valid command. Press h for help" % (choice[0])
--------------------------------
--
Adriano Varoli Piazza
The Inside Out: http://moranar.com.ar
MSN: adrianomd at hotmail.com
ICQ: 4410132
More information about the Tutor
mailing list