![]() |
Convert list to file object without creating an actual file.
I have written a little program that takes as input a text file,
converts it to a list with appropriate html coding (making it into a nice table). Finally I want to upload this list as a textfile using ftp. If homeworkhtml contains the list of lines; e.g. homeworkhtml = ["<table>", "<tr>", "<td>", "test", "</td>" ..... I want to call: ftp.storlines("STOR " + filename, homeworkhtml) which gives me the error Traceback (most recent call last): File "./testhw.py", line 67, in ? ftp.storlines("STOR " + filename, homeworkhtml) File "/System/Library/Frameworks/Python.framework/Versions/2.3/lib/ python2.3/ftplib.py", line 428, in storlines AttributeError: 'list' object has no attribute 'readline' Expected since homeworkhtml is in fact not a file. Is there a way to convert this list to a file object without first writing it to disc and then opening the resulting file? Best, Bart |
Re: Convert list to file object without creating an actual file.
On Jan 24, 8:57 pm, Bart Kastermans <bkast...@gmail.com> wrote:
> I have written a little program that takes as input a text file, > converts > it to a list with appropriate html coding (making it into a nice > table). > Finally I want to upload this list as a textfile using ftp. > > If homeworkhtml contains the list of lines; > e.g. homeworkhtml = ["<table>", "<tr>", "<td>", "test", "</td>" ..... > > I want to call: > ftp.storlines("STOR " + filename, homeworkhtml) > > which gives me the error > Traceback (most recent call last): > File "./testhw.py", line 67, in ? > ftp.storlines("STOR " + filename, homeworkhtml) > File "/System/Library/Frameworks/Python.framework/Versions/2.3/lib/ > python2.3/ftplib.py", line 428, in storlines > AttributeError: 'list' object has no attribute 'readline' Perhaps what you want is StringIO. It lets your pretend a string is a file so ftplib won't choke. You'll have to convert your list to a string, though (perhaps with join): from cStringIO import StringIO fake_file = StringIO("".join(my_list)) > > Expected since homeworkhtml is in fact not a file. Is there a way > to convert this list to a file object without first writing it to disc > and > then opening the resulting file? > > Best, > Bart |
Re: Convert list to file object without creating an actual file.
On Thu, 24 Jan 2008 18:57:58 -0800, Bart Kastermans wrote:
> I have written a little program that takes as input a text file, .... > Expected since homeworkhtml is in fact not a file. Is there a way to > convert this list to a file object without first writing it to disc and > then opening the resulting file? The StringIO module is your friend, together with a couple of basic Python techniques. >>> alist = ["<table>\n", " <tr>\n", .... " <td>", "Nobody expects the Spanish Inquisition!", .... "</td>\n", " </tr>\n", "</table>\n"] >>> print ''.join(alist) # but strings don't have a readlines method... <table> <tr> <td>Nobody expects the Spanish Inquisition!</td> </tr> </table> >>> >>> f = StringIO.StringIO() >>> f.writelines(alist) >>> f.getvalue() '<table>\n <tr>\n <td>Nobody expects the Spanish Inquisition!</td>\n </tr>\n</table>\n' >>> f.seek(0) # don't forget to reset the file pointer! >>> print f.read() # also has readlines <table> <tr> <td>Nobody expects the Spanish Inquisition!</td> </tr> </table> -- Steven |
Re: Convert list to file object without creating an actual file.
The suggestion to use StringIO to make a string have the same
interface as a file works perfect in my situation. Here is now the working result (just in case it is useful to anyone) part of this is still a definite hack and suggestions for improvement are certainly appreciated. Want: have an easily maintainable file containing homework assignments, but have it nicely formatted on my webpage. Solution: have a file with due dates and assignments as follows: Mon Jan 28 1.1: 1,2,3 (at this point only the indentation is taken into account). Then use the following script (setting some variables and server, login, and passwd for the ftp connection): #!/usr/bin/env python homeworktxt = "homework.txt" homeworkhtml = [] import sys import ftplib import StringIO Indent = ' ' StartTable = '<table border="1" width="100%"><tr><td>Due</ td><td>Assignment</td></tr>\n<tr>' EndTable = '</table>' StartTitle = Indent + '<tr>\n' + Indent + Indent +'<td valign="top">' EndTitle = Indent + Indent + '</td>\n' + Indent + Indent + '<td>' BeforeItems = Indent + Indent + Indent + '<table>' AfterItems = Indent + Indent + Indent + '</table>\n' + Indent + Indent + '</td>\n' + Indent + '</tr>' StartItem = Indent + Indent + Indent + Indent + '<tr><td>' EndItem = Indent + Indent + Indent + Indent + '</td></tr>' #if 1 >=len (sys.argv): # print "Need an filename as an argument" # print sys.argv[0] + " <filename>" #else: hw = open (homeworktxt).readlines() Last = 0 # 0: at the start, 1: just printed an item, 2: just printed a title #print StartTable homeworkhtml.append(StartTable) for x in hw: if ' ' == x[0]: if 2 == Last: homeworkhtml.append(BeforeItems) homeworkhtml.append(StartItem) homeworkhtml.append(Indent + Indent + Indent + Indent + Indent + x.strip()) homeworkhtml.append(EndItem) Last = 1 elif '#' != x[0]: if 1 == Last: homeworkhtml.append(AfterItems) homeworkhtml.append(StartTitle) homeworkhtml.append(Indent + Indent + Indent + x.strip()) homeworkhtml.append(EndTitle) Last = 2 # else : # homeworkhtml.append('COMMENT') # homeworkhtm if 1 == Last: homeworkhtml.append(AfterItems) homeworkhtml.append(EndTable) for i in range(0,len(homeworkhtml)): homeworkhtml[i] = homeworkhtml[i] + '\n' homeworkhtmlfile = StringIO.StringIO() homeworkhtmlfile.writelines(homeworkhtml) homeworkhtmlfile.seek(0) # open connection to the server ftp = ftplib.FTP('server', 'login', 'password' ) # go to location of root of website on server ftp.cwd('httpdocs') # put the contends of a file filename = "test.html" ftp.storlines("STOR " + filename, homeworkhtmlfile) # quite the connection ftp.quit() This will result in an html file that you can include (say with php include) into a webpage displaying a table. Examples of the result are currently on my webpage (www.bartk.nl/teach.php ) (if you read this much later look on the waybackmachine). Again, thanks for the suggestions, Best, Bart PS: apologies for the mixing of spaces and tabs. I had a computer crash and have not yet corrected the settings. So this is a combination of default behavior and my preferred settings. |
| All times are GMT. The time now is 10:30 AM. |
Powered by vBulletin®. Copyright ©2000 - 2013, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.