nephish a écrit : > Hey there, > i am trying to write an online application using the cgi module. > what i want to do is have an html form display a drop-down list and > have the values of that list be the lines of text written in a file.
Simplest, Q&D solution : 1/ open the file for reading 2/ print out the beginning of the html tags for the dropdown (hint: in html, it's <input type="select">) 3/ for each line in the file, print out the html tags and the line 4/ print out the end of the html 5/ close the file which gives (first try, Q&D, naive implementation, no error handling, etc: f = open("myfile.txt") print "<input type='select' name='my-drop-down-list'>" for line in f: print "<option>%s</option>" % line.strip() print "</input>" f.close() Now there may be some conditions we want to handle: file doesnt exist or is not readable, file is empty, a line is empty, etc. A second try could be like: try: f = open("myfile.txt") except IOError, e: # TODO : handle error. in the meantime: print "could not open myfile.txt for reading : %s" % e sys.exit(1) else: print "<input type='select' name='my-drop-down-list'>" for line in f: if line.strip(): print "<option>%s</option>" % line.strip() print "</input>" f.close() Well... This does not handle all potential problems, and we begin to have useless repetitions (here the 'line.strip()' expression). We need to stop and think a little bit. This snippet tries to do too many things at once: reading a file line by line, and printing the html for a select. Since we won't use selects for huge lists (for obvious usability reasons), we can assume that working with an in-memory list will be ok. So we could split this in two parts: one that read the file and returns a cleaned-up, ready to use list, and one that output the needed html: # first part try: f = open("myfile.txt") except IOError, e: # TODO : handle error. in the meantime: print "could not open myfile.txt for reading : %s" % e sys.exit(1) else: options = filter(None, [line.strip() for line in f]) f.close() # second part: if options: print "<input type='select' name='my-drop-down-list'>" for line in options: print "<option>%s</option>" % line print "</input>" else: # Err ? what should we do here ? print "<i>no selectable option here</i>" Hmm... Better, but still not ok. We can already guess that both parts can be useful indepently of each other, in in other contexts. So why not making this a little be generic ? def listFrom(openedFile): return filter(None, [line.strip() for line in openedFile]) def printSelect(name, options): print "<input type='select' name='%s'>" % name for line in options: print "<option>%s</option>" % line print "</input>" def printSelectFromFile(name, path): try: f = open(path) except IOError, e: # TODO : handle error. in the meantime: print "could not open %s for reading : %s" % (path, e) sys.exit(1) else: options = listFrom(f) f.close() if options: printDropdownList(name, options) else: print "<i>no selectable option here</i>" Well, this could of course be much more improved, but this will depend on stuffs specific to your application, so I'll leave it up to you... > this would be updated almost every time the site is visited. Err... Better take care of concurrent access... > i have been sucessful in writing text to a file from an html form. but > i need to access this so it can be selected. > is there a way to do this? i have found limited info on how to really > use the cgi module. AFAICT, there's nothing related to the cgi module in your problem. HTH Bruno -- http://mail.python.org/mailman/listinfo/python-list