[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