[EMAIL PROTECTED] wrote: > On Nov 20, 4:37 pm, Jarek Zgoda <[EMAIL PROTECTED]> wrote: > >> Try with StringIO/cStringIO, these modules are supposed to give you >> in-memoryobjects compatible with file object interface. > > I found this solution not working. > I had similar problem: I wanted to write some string into the in- > memory file, then transfer it via ftp to some file and forget in- > memory content. > > from ftplib import FTP > ftp = FTP('ftp.server.org') > ftp.login('ID','pswd') > import StringIO > filename = 'some_file.txt' > command = 'STOR ' + filename > outfile = StringIO.StringIO() > outfile.write(some_string + '\n')
Try it again with outfile.seek(0) before the storlines() call. > ftp.storlines(command, outfile) > ftp.quit() > outfile.close() > > The file shows up on the FTP server, but with ZERO length. I believe you would see the same problem if outfile were a real file. > I think the > problem is that ftp.storelines attempts to use outfile's read() > function, which is not present in StringIO objects (they use > getvalue() instead). Quite an annoying inconsistency. >>> "read" in dir(StringIO.StringIO()) True A quick look into the source code can put an end to the rest of that speculation: def storlines(self, cmd, fp): '''Store a file in line mode.''' self.voidcmd('TYPE A') conn = self.transfercmd(cmd) while 1: buf = fp.readline() if not buf: break if buf[-2:] != CRLF: if buf[-1] in CRLF: buf = buf[:-1] buf = buf + CRLF conn.sendall(buf) conn.close() return self.voidresp() storlines() will happily accept every object fp featuring a readline() method. > Any thoughts, please? Keep the library docs under your pillow and the library source on your screen :) Peter -- http://mail.python.org/mailman/listinfo/python-list