我想送与Python FTPLIB文件,从一个FTP站点到另一个,这样可避免文件的读/写processees。

我创建了一个BytesIO流:

MYFILE = BytesIO()

我成功地检索ftp站点一个与retrbinary一个映像文件:

ftp_one。retrbinary(“RETR P。JPG”,MYFILE。写)

我可以保存此内存对象的常规文件:

FOT =开放(“casab。JPG '' WB“)

FOT = MYFILE。readvalue()

但我无法通过FTP发送该流与storbinary。我认为这会工作:

ftp_two。storbinary(“STOR magnafoto。JPG”,MYFILE。的GetValue())

但犯规。我弄了半天错误味精以“BUF = FP结束。阅读(块大小) AttributeError的:“海峡”对象有没有属性“读”

我也试过很多荒谬binations,但没有成功。顺便说一句,我还什么我真的myfoto做得相当不解。写。不应该说,它是myfoto。写() ?

我也很无能这个缓冲区的事做什么或需要。是我想太多折襞实现? 如果我只是乒乓与中间写的文件/读取我的系统? 泰所有

编辑:感谢abanert我得到的东西直。为了记录在案,storbinary论点是错误的和MYFILE。求(0)是需要的“倒带”的流发送之前。这是一个工作片段,没有中间物理文件写入两台FTP地址之间移动的文件:

进口FTPLIB如FTP
从IO进口BytesIO

ftp_one = FTP。FTP(地址1,用户1,PASS1)
ftp_two = FTP。FTP(地址2,用户2 PASS2)
MYFILE = BytesIO()
ftp_one。retrbinary(“RETR imageoldname。JPG”,MYFILE。写)
MYFILE。寻求(0)
ftp_two。storbinary(“STOR imagenewname。JPG”,MYFILE)
ftp_one。关 ()
ftp_two。关 ()
MYFILE。关 ()

问题是,我们在调用的GetValue()。只是不这样做:

ftp_two。storbinary(“STOR magnafoto。JPG”,MYFILE)

需要一个类似文件的对象,它可以调用阅读。

幸运的是,你刚才这样一个对象,MYFILE,一 。(这不是从你的代码完全清楚什么事情的顺序是在这里,如果不工作,不被你可能需要MYFILE。寻求(0),或在不同的模式或东西创建。但BytesIO将与storbinary工作,除非你做了错事。)

但是,强似MYFILE,你通过MYFILE。的GetValue()。和“返回字节包含缓冲的全部内容。“

因此,而不是给storbinary一个类文件对象,它可以调用阅读,你给它一个字节的对象,这当然是同在Python 2 STR。X,你不能调用read上。


为了您的旁白:

顺便说一句,我还什么我真的myfoto做得相当不解。写。不应该说,它是myfoto。写() ?

看着 。第二个参数是不是一个文件,它是一个回调函数。

打回来 函数被调用用于所接收的数据的每个块,具有一个字符串参数给出数据块。

你想要的是每个数据块追加到myfoto结束函数。虽然你可以编写自己的函数来做到这一点:

高清回调(block_of_data):
    myfoto。写(block_of_data)

。?它应该是很明显的,这个功能不完全一样的东西作为myfoto。写方法。所以,你可以只传递方法本身。

如果你不理解绑定方法,请参见教程。


这种灵活性,怪异,因为它似乎,让你做的东西比下载整个文件到缓冲区甚至不如送到另一台服务器。实际上,你可以同时打开两个连接,并使用回调,因为它是接收从源服务器到目标服务器发送的每个缓冲区,而没有存储任何超过一个缓冲。

但是,除非你真的很需要那,你可能不想去通过所有的复杂性。

事实上,在一般情况下,FTPLIB是一种低层次的。而且它有一些设计(就像storbinary需要一个文件的事实,而retrbinary需要一个回调),使总感觉在低的水平,但似乎从更高的层次很奇怪。所以,你可能需要做一个看一些更高级别的图书馆 。

:>>


本文链接:FTP发送Python的字节流(ftp sending python bytesio stream)

您可能也会喜欢

友情链接:

大悲咒注音 经文 心经唱诵