ftp.retrbinary () ayuda a python

He creado una secuencia de comandos de Python para conectarme a un servidor remoto.

datfile = [] for dk in range(len(files)): dfnt=files[dk] dpst=dfnt.find('.dat') if dpst == 15: dlist = dfnt[:] datfile.append(dlist) assert datfile == ['a.dat','b.dat'] # True 

que como puedes ver crea una lista. ahora estoy pasando esta lista a

 ftp.retrbinary('datfile') 

pero esta línea devuelve un error:

 typeerror: retrbinary() takes at least 3 arguments (2 given) 

no está seguro de lo que está buscando?

Te dice que no estás proporcionando suficientes argumentos al método retrbinary .

La documentación especifica que también debe proporcionar una función de “callback” que se llama para cada bloque de datos recibidos. Querrá escribir una función de callback y hacer algo con los datos que le proporciona (p. Ej., Escribirlo en un archivo, recostackrlo en la memoria, etc.)

Como nota al margen, puede preguntar por qué dice que hay ‘3’ argumentos necesarios en lugar de solo ‘2’. Esto se debe a que también cuenta el argumento ‘propio’ que Python requiere en los métodos de instancia, pero implícitamente lo está pasando con la referencia del objeto ftp .

EDITAR – Parece que no haya respondido completamente tu pregunta.

Para el argumento del command se supone que debes pasar un comando RETR válido, no una lista.

 filenames = ['a.dat', 'b.dat'] # Iterate through all the filenames and retrieve them one at a time for filename in filenames: ftp.retrbinary('RETR %s' % filename, callback) 

Para la callback , debe pasar algo que sea llamable (generalmente una función de algún tipo) que acepte un solo argumento. El argumento es una parte de los datos del archivo que se está recuperando. Digo un ‘fragmento’ porque cuando mueves archivos grandes alrededor, rara vez quieres mantener todo el archivo en la memoria. La biblioteca está diseñada para invocar su callback de manera iterativa, ya que recibe fragmentos de datos. Esto le permite escribir fragmentos del archivo para que solo tenga que mantener una cantidad relativamente pequeña de datos en la memoria en un momento dado.

Mi ejemplo aquí es un poco avanzado, pero su callback puede ser un cierre dentro del bucle for que escribe en un archivo que se ha abierto:

 import os filenames = ['a.dat', 'b.dat'] # Iterate through all the filenames and retrieve them one at a time for filename in filenames: local_filename = os.path.join('/tmp', filename) # Open a local file for writing (binary mode)... # The 'with' statement ensures that the file will be closed with open(local_filename, 'wb') as f: # Define the callback as a closure so it can access the opened # file in local scope def callback(data): f.write(data) ftp.retrbinary('RETR %s' % filename, callback) 

Esto también se puede hacer de manera más concisa con una statement lambda , pero me parece que las personas nuevas en Python y algunos de sus conceptos de estilo funcional comprenden el primer ejemplo más fácilmente. Sin embargo, aquí está la llamada ftp con un lambda en su lugar:

 ftp.retrbinary('RETR %s' % filename, lambda data: f.write(data)) 

Supongo que incluso podría hacer esto, pasando el método de instancia de write del archivo directamente como su callback:

 ftp.retrbinary('RETR %s' % filename, f.write) 

Los tres de estos ejemplos deben ser análogos y, con suerte, rastrearlos les ayudará a comprender lo que sucede.

He elidido cualquier tipo de manejo de errores por ejemplo.

Además, no probé ninguno de los códigos anteriores, así que si no funciona, avíseme y veré si puedo aclararlo.