Ответ 1
Ну, у вас есть ответ прямо перед вами: метод retrbinary принимает в качестве второго параметра ссылку на функцию, которая вызывается всякий раз, когда содержимое файла извлекается из соединения ftp.
Вот простой пример:
#!/usr/bin/env python
from ftplib import FTP
def writeFunc(s):
print "Read: " + s
ftp = FTP('ftp.kernel.org')
ftp.login()
ftp.retrbinary('RETR /pub/README_ABOUT_BZ2_FILES', writeFunc)
Вы должны реализовать writeFunc, чтобы он фактически добавлял прочитанные данные во внутреннюю переменную, что-то вроде этого, которая использует вызываемый объект:
#!/usr/bin/env python
from ftplib import FTP
class Reader:
def __init__(self):
self.data = ""
def __call__(self,s):
self.data += s
ftp = FTP('ftp.kernel.org')
ftp.login()
r = Reader()
ftp.retrbinary('RETR /pub/README_ABOUT_BZ2_FILES', r)
print r.data
Обновление: я понял, что в стандартной библиотеке Python есть модуль, предназначенный для такого рода вещей, StringIO:
#!/usr/bin/env python
from ftplib import FTP
from io import StringIO
ftp = FTP('ftp.kernel.org')
ftp.login()
r = StringIO()
ftp.retrbinary('RETR /pub/README_ABOUT_BZ2_FILES', r.write)
print r.getvalue()
Обновление 2: StringIO был добавлен в io. Объединенный комментарий @TimRichardson.: