¿Puedo cargar un objeto en la memoria a FTP usando Python?

Esto es lo que estoy haciendo ahora:

mysock = urllib.urlopen('http://localhost/image.jpg') fileToSave = mysock.read() oFile = open(r"C:\image.jpg",'wb') oFile.write(fileToSave) oFile.close f=file('image.jpg','rb') ftp.storbinary('STOR '+os.path.basename('image.jpg'),f) os.remove('image.jpg') 

Escribir archivos en el disco y luego eliminarlos inmediatamente parece un trabajo adicional en el sistema que debe evitarse. ¿Puedo cargar un objeto en la memoria a FTP usando Python?

Debido a la tipificación de pato , el objeto de archivo ( f en su código) solo tiene que admitir la llamada storbinary .read(blocksize) para trabajar con storbinary . Cuando me enfrento a preguntas como esta, voy a la fuente, en este caso lib / python2.6 / ftplib.py:

 def storbinary(self, cmd, fp, blocksize=8192, callback=None): """Store a file in binary mode. A new port is created for you. Args: cmd: A STOR command. fp: A file-like object with a read(num_bytes) method. blocksize: The maximum data size to read from fp and send over the connection at once. [default: 8192] callback: An optional single parameter callable that is called on on each block of data after it is sent. [default: None] Returns: The response code. """ self.voidcmd('TYPE I') conn = self.transfercmd(cmd) while 1: buf = fp.read(blocksize) if not buf: break conn.sendall(buf) if callback: callback(buf) conn.close() return self.voidresp() 

Como se comentó, solo quiere un objeto similar a un archivo , de hecho, ni siquiera es particularmente similar a un archivo, solo necesita read(n) . StringIO proporciona tales servicios de “archivo de memoria”.

 import urllib import ftplib ftp = ftplib.FTP(...) f = urllib.urlopen('http://localhost/image.jpg') ftp.storbinary('STOR image.jpg', f)