Chcę wysłać plik z python ftplib, z jednej strony ftp do drugiej, aby uniknąć plików do odczytu/zapisu.ftp wysyłając strumień bajtów bajtów
utworzyć strumień BytesIO:
myfile=BytesIO()
A ja pomyślnie pobrać plik obrazu z ftp miejscu jednej z retrbinary:
ftp_one.retrbinary('RETR P1090080.JPG', myfile.write)
mogę zapisywać obiekt pamięci do zwykłego pliku:
fot=open('casab.jpg', 'wb')
fot=myfile.readvalue()
Ale nie mogę wysłać tego strumienia przez ftp ze storbinary. Myślałem, że to zadziała:
ftp_two.storbinary('STOR magnafoto.jpg', myfile.getvalue())
Ale nie robi. otrzymuję długi komunikat o błędzie kończący się na "buf = fp.read (blocksize) AttributeError: obiekt 'str' nie ma atrybutu 'odczyt'
Próbowałem także wielu absurdalnych kombinacji, ale bez powodzenia. Odkładając na bok, jestem również bardzo zaskoczony tym, co naprawdę robię z myfoto.write. Czy nie powinno to być myfoto.write()?
Jestem również całkiem nieświadoma tego, co robi ten bufor. Czy to, co chcę osiągnąć, jest zbyt skomplikowane? Czy powinienem po prostu pingować pliki z pośrednim zapisem/odczytem w moim systemie? Ty wszystkie
EDYCJA: dzięki abanert mam rzeczy prosto. Dla rekordu argumenty storbinary były błędne, a plik myfile.seek (0) był potrzebny do "przewinięcia" strumienia przed wysłaniem go. Jest to fragment pracy, która porusza plików między dwoma adresami ftp bez pośredniego zbioru fizycznego pisze:
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 boczna: "Mogę zapisać ten obiekt pamięci do zwykłego pliku" w rzeczywistości nie zapisuje w ogóle informacji. 'fot = open ('casab.jpg', 'wb')' tworzy nowy pusty plik, a następnie 'fot = myfile.readvalue()' zapomina o obiekcie pliku, zastępując go ciągiem znaków. Potrzebujesz czegoś takiego jak "fot.write (myfile.readvalue())", aby faktycznie zapisywać do pliku. (Możesz także, ale nie musi, najpierw "myfile.seek (0)"). – abarnert