Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Convert list to file object without creating an actual file.

Reply
Thread Tools

Convert list to file object without creating an actual file.

 
 
Bart Kastermans
Guest
Posts: n/a
 
      01-25-2008
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
 
Reply With Quote
 
 
 
 
Benjamin
Guest
Posts: n/a
 
      01-25-2008
On Jan 24, 8:57 pm, Bart Kastermans <(E-Mail Removed)> 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


 
Reply With Quote
 
 
 
 
Steven D'Aprano
Guest
Posts: n/a
 
      01-25-2008
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
 
Reply With Quote
 
Bart Kastermans
Guest
Posts: n/a
 
      01-25-2008
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.
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Adding contents on yaml file without overwriting actual contents Kamarulnizam Rahim Ruby 4 01-28-2011 09:10 AM
Convert obejct string repr to actual object =?ISO-8859-1?Q?Tor_Erik_S=F8nvisen?= Python 2 10-08-2007 10:47 PM
Changing a Character-object without creating a new object (?) Jesper Sahner Java 4 01-18-2005 02:48 PM
convert list of strings to set of regexes; convert list of strings to trie Klaus Neuner Python 7 07-26-2004 07:25 AM
Any way to rename a current File without creating a new File object? C-man Java 9 04-11-2004 04:21 AM



Advertisments