convert ftp.retrbinary to file object? - Python language lacks expression?
Martin Franklin
mfranklin1 at gatwick.westerngeco.slb.com
Thu Feb 3 06:20:22 EST 2005
Martin Franklin wrote:
> Robert wrote:
>
>> I just tried to convert a (hugh size) ftp.retrbinary run into a
>> pseudo-file object with .read(bytes) method in order to not consume
>> 500MB on a copy operation.
[snip]
>
>
> Hmmmm this is nearly there I think...:
whoops... spoke too soon..
>
> import ftplib
>
> class TransferAbort(Exception): pass
>
> class FTPFile:
> def __init__(self, server, filename):
> self.server = server
> self.filename = filename
> self.offset = 0
>
> def callback(self, data):
> self.offset = self.offset + len(data)
> self.data = data
> ## now quit the RETR command?
> raise TransferAbort("stop right now")
>
> def read(self, amount):
> self.ftp = ftplib.FTP(self.server)
> self.ftp.login()
I needed to insert a time.sleep(0.1) here as the connections were
falling over themselves - I guess testing with a blocksize of 24
is a little silly.
> try:
> self.ftp.retrbinary("RETR %s" %self.filename, self.callback,
> blocksize=amount,
> rest=self.offset)
> except TransferAbort:
> return self.data
>
>
> f = FTPFile("HOSTNAME", "FILENAME")
>
> print f.read(24)
> print f.read(24)
>
## new test...
f = FTPFile("HOSTNAME", "FILENAME")
while 1:
data = f.read(24)
if not data:
break
print data,
>
> I open the ftp connection inside the read method as it caused an error
> (on the second call to read) when I opened it in __init__ ???
>
> HTH
> Martin
>
>
More information about the Python-list
mailing list