Tôi muốn gửi tệp có ftplib python, từ một trang web ftp này đến trang khác, do đó, để tránh tệp đọc/ghi processees.ftp gửi luồng python byteio
tôi tạo ra một dòng BytesIO:
myfile=BytesIO()
Và tôi thành công lấy một file ảnh từ ftp site một với retrbinary:
ftp_one.retrbinary('RETR P1090080.JPG', myfile.write)
tôi có thể tiết kiệm đối tượng bộ nhớ này vào một tập tin thường xuyên:
fot=open('casab.jpg', 'wb')
fot=myfile.readvalue()
Nhưng tôi không thể gửi luồng này qua ftp với storbinary. Tôi nghĩ điều này sẽ hoạt động:
ftp_two.storbinary('STOR magnafoto.jpg', myfile.getvalue())
Nhưng không. tôi nhận được một thông báo lỗi dài kết thúc bằng 'buf = fp.read (blockize) AttributeError: đối tượng' str 'không có thuộc tính' read '
Tôi cũng đã thử nhiều kết hợp vô lý, nhưng không thành công. Là một sang một bên, tôi cũng khá bối rối với những gì tôi đang thực sự làm với myfoto.write. Không nên là myfoto.write()?
Tôi cũng khá thất bại với những gì mà bộ đệm này làm hoặc yêu cầu. Là những gì tôi muốn quá phức tạp để đạt được? Tôi có nên ping pong các tập tin với một viết/đọc trung gian trong hệ thống của tôi? Ty tất cả
CHỈNH SỬA: cảm ơn tôi đã hiểu mọi thứ một cách thẳng thắn. Đối với hồ sơ, đối số storbinary đã sai và một myfile.seek (0) là cần thiết để 'tua lại' các dòng trước khi gửi nó. Đây là một đoạn làm việc mà di chuyển một tập tin giữa hai địa chỉ ftp mà không cần tập thể chất trung gian viết:
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()
Lưu ý phụ: "Tôi có thể lưu đối tượng bộ nhớ này vào một tệp thông thường" không thực sự lưu thông tin. 'fot = open ('casab.jpg', 'wb')' tạo một tệp trống mới, sau đó 'fot = myfile.readvalue()' quên về đối tượng tệp, thay thế nó bằng một chuỗi. Bạn cần một cái gì đó như 'fot.write (myfile.readvalue())' để thực sự ghi vào một tập tin. (Bạn có thể hoặc có thể không cần đến 'myfile.seek (0)' trước tiên.) – abarnert