Est-il possible de lire des fichiers FTP sans les écrire en utilisant Python?
j'essaie de lire des fichiers en utilisant ftplib de Python sans les écrire. Quelque chose à peu près équivalent à:
def get_page(url):
try:
return urllib.urlopen(url).read()
except:
return ""
mais en utilisant FTP.
j'ai essayé:
def get_page(path):
try:
ftp = FTP('ftp.site.com', 'anonymous', 'passwd')
return ftp.retrbinary('RETR '+path, open('page').read())
except:
return ''
mais cela ne fonctionne pas. Les seuls exemples dans les docs impliquent l'écriture de fichiers en utilisant le ftp.retrbinary('RETR README', open('README', 'wb').write)
format. Est-il possible de lire des fichiers ftp sans écrire d'abord?
1 réponses
Eh bien, vous avez la réponse juste devant vous: la méthode rétrbinary accepte comme second paramètre une référence à une fonction qui est appelée chaque fois que le contenu du fichier est récupéré à partir de la connexion ftp.
Voici un exemple simple:
#!/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)
vous devriez implémenter writeFunc pour qu'il ajoute réellement les données lues à une variable interne, quelque chose comme ceci, qui utilise un objet appelable:
#!/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
mise à Jour: j'ai réalisé que il y a un module dans la bibliothèque standard de Python qui est destiné à ce genre de choses, StringIO:
#!/usr/bin/env python
from ftplib import FTP
from StringIO import StringIO
ftp = FTP('ftp.kernel.org')
ftp.login()
r = StringIO()
ftp.retrbinary('RETR /pub/README_ABOUT_BZ2_FILES', r.write)
print r.getvalue()