Desidero inviare un file con python ftplib, da un sito ftp a un altro, in modo da evitare processi di lettura/scrittura.ftp invio di python bytesio stream
ho creare un flusso BytesIO:
myfile=BytesIO()
E io con successo recuperare un file immagine dal sito ftp uno con retrbinary:
ftp_one.retrbinary('RETR P1090080.JPG', myfile.write)
posso salvare questo oggetto di memoria a un file regolare:
fot=open('casab.jpg', 'wb')
fot=myfile.readvalue()
Ma non sono in grado di inviare questo flusso tramite ftp con storbinary. Ho pensato che questo avrebbe funzionato:
ftp_two.storbinary('STOR magnafoto.jpg', myfile.getvalue())
Ma non. ricevo un errore lungo msg che termina con 'buf = fp.read (blocksize) AttributeError: l'oggetto' str 'non ha attributo' read '
Ho provato anche molte combinazioni assurde, ma senza successo. Per inciso, sono anche abbastanza perplesso con quello che sto facendo davvero con myfoto.write. Non dovrebbe essere myfoto.write()?
Sono anche abbastanza indifferente a ciò che questo buffer fa o richiede. È quello che voglio troppo complicato da raggiungere? Dovrei semplicemente pingare i file con una scrittura/lettura intermedia nel mio sistema? Ty all
EDIT: grazie ad abanert ho capito bene. Per la cronaca, gli argomenti di storbinary erano errati e un myfile.seek (0) era necessario per 'riavvolgere' lo stream prima di inviarlo. Si tratta di un frammento di lavoro che si muove di un file tra due indirizzi FTP senza file fisico intermedio scrive:
import ftplib as ftp
from io import BytesIO
ftp_one=ftp.FTP(address1, user1, pass1)
ftp_two=ftp.FTP(address2, user2, pass2)
myfile=BytesIO()
ftp_one.retrbinary ('RETR imageoldname.jpg', myfile.write)
myfile.seek(0)
ftp_two.storbinary('STOR imagenewname.jpg', myfile)
ftp_one.close()
ftp_two.close()
myfile.close()
Nota a margine: "È possibile salvare questo oggetto di memoria in un file normale" in realtà non salva le informazioni. 'fot = open ('casab.jpg', 'wb')' crea un nuovo file vuoto, quindi 'fot = myfile.readvalue()' si dimentica dell'oggetto file, sostituendolo con una stringa. Hai bisogno di qualcosa come 'fot.write (myfile.readvalue())' per scrivere effettivamente in un file. (Puoi anche o non aver bisogno di 'myfile.seek (0)' per prima cosa.) – abarnert