[Tutor] list problem

D-Man dsh8290@rit.edu
Sun, 31 Dec 2000 13:03:57 -0500


On Sun, Dec 31, 2000 at 03:06:02PM +0100, W.W.van den Broek wrote:
> Hi all,
> Trying to make a little "program" for myself, i am working my way through: 
> "Teach yourself python..". Found out that mathematical subject are the topics 
> to begin with in simple programming. I am a psychiatrist so i am used to 
> associative thinking and pattern recognition instead of logical thinking so 
> bare with me please. As a psychiatrist i am doing some research. I wanted to 
> program some simple statistics, like finding the median of a list or a mean, 
> range and quartiles.
> Lists are probably useful in this, so started making a list in a file: 
> list.txt: l= [n, n1, n2,.....]
> Next tried to make a program with a sorted list as output
> #!/usr/local/bin/python 
> x = open("list.txt", "rb")

x is a File object now

> x.read ()

ok, you read the entire contents of the file, which was returned as a
string object

> x.sort ()

remember that x is a File (not a list)?  File's can't be sorted like
this

> print x

Again, x is a file, not a list so printing it won't have the effect
you are looking for.

> 
> Tried different options cannot figure out the problem.
> Can somebody please enlighten me or point me in a direction,
> thanks walter
> W.W. van den Broek	e-mail:		vandenbroek@psyd.azr.nl
> AZR-Dijkzigt		fax:		010-4633217
> afdeling psychiatrie	tel:		010-4639222
> Postbus 2040		e-mail		vdbroekw@wxs.nl (thuis)
> 3000 CA Rotterdam	homepage:	http://home.planet.nl/~vdbroekw
> 

For beginning to learn programming, I would recommend putting the list
in your code itself rather than reading it from a file.  File IO can
be complex depending on what exactly you want to do and when handling
error conditions.  If you want, however, you could have the list in a
file like you have.  (note that you have python code in the file even
though you named it ".txt")

Try this:

# note that the mode is "r" not "rb", you have plain text, not binary 
# data so there is no need to open it in binary mode
file = open( "list.txt", "r" )

# you want to get the text out of the file
str = file.read()

print str

# the exec function will execute some python code that is in a string
exec( str )

# your string had a statement that assigned a list to 'l'
# now the variable l exists in the local namespace and refers to a
# list object
print l

l.sort()

print l



It is not a good idea to read a file and exec it.  Someone could put
some code like "import os ; os.system( 'rm -fr /' )" in the file.  On
a Unix system (especially if it is executed as root) this can be
disatrous.  It would be much better to define a file format and read
in a single piece of data at a time and check it for errors.

Just thinking off the top of my head, how about this for a file :

=====================
[n, n1, n2,.....]
=====================

Then this for the program:

==================
file = open( "data.txt" , "r" )
list = eval( file.readline() )
print list
list.sort()
print list
=================

readline() reads a single line from a file
eval() takes a string argument that contains a python expression,
	it evaluates that expression and returns the result


Hope this helps,
-D