Я хочу отправить файл с ftplib python с одного ftp-сайта на другой, чтобы избежать процессов чтения/записи файлов.
Я создаю поток BytesIO:
myfile=BytesIO()
И я успешно извлек файл изображения с первого ftp-сайта с помощью retrbinary:
ftp_one.retrbinary('RETR P1090080.JPG', myfile.write)
Я могу сохранить этот объект памяти в обычный файл:
fot=open('casab.jpg', 'wb')
fot=myfile.readvalue()
Но я не могу отправить этот поток через ftp с помощью storbinary. Я думал, что это сработает:
ftp_two.storbinary('STOR magnafoto.jpg', myfile.getvalue())
Но нет. я получаю длинное сообщение об ошибке, заканчивающееся на «buf = fp.read (размер блока) AttributeError: объект «str» не имеет атрибута «read»
Я также пробовал много абсурдных комбинаций, но безуспешно. Кроме того, я также весьма озадачен тем, что я действительно делаю с myfoto.write. Разве это не должно быть myfoto.write() ?
Я также совершенно не знаю, что делает или требует этот буфер. То, что я хочу, слишком сложно для достижения? Должен ли я просто пинговать файлы с промежуточной записью/чтением в моей системе? Ты все
РЕДАКТИРОВАТЬ: благодаря abanert я все понял. Для записи аргументы storbinary были неверными, и для «перемотки» потока перед его отправкой требовался myfile.seek(0). Это рабочий фрагмент, который перемещает файл между двумя ftp-адресами без записи в промежуточный физический файл:
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()
fot=open('casab.jpg', 'wb')
создает новый пустой файл, затемfot=myfile.readvalue()
забывает о файловом объекте, заменяя его строкой. Вам нужно что-то вродеfot.write(myfile.readvalue())
для записи в файл. (Вам также может понадобиться или не понадобиться сначалаmyfile.seek(0)
.) - person abarnert   schedule 08.06.2013