Python直接在FTP中编写创建文件

Kev*_*291 10 python ftp

我期待从python直接写入我的FTP站点的文本而不在磁盘上存储临时文件,如:

ftp = FTP('ftp.mysite.com')
ftp.login('un','pw')
ftp.cwd('/')
ftp.storbinary('STOR myfile.html', 'text to store', 'rb')
Run Code Online (Sandbox Code Playgroud)

这有可能吗?非常感谢你.

aba*_*ert 12

正如文档所说:

以二进制传输模式存储文件.cmd应该是一个合适的STOR命令:"STOR filename".file是一个文件对象(以二进制模式打开),直到EOF使用其read()大小大小的块中的方法读取,以提供要存储的数据...

因此,您需要使用适当的read方法为其提供类似文件的对象.

字符串不是类似文件的对象,而是一个io.BytesIO.所以:

import io
bio = io.BytesIO(b'text to store')
ftp.storbinary('STOR myfile.html', bio)
Run Code Online (Sandbox Code Playgroud)

另外,请注意我没有通过那个'rb'论点.第三个参数storbinaryblocksize,'rb'显然不是有效的块大小.


如果您需要使用Python 2.5或更早版本,请参阅Dan Lenski的答案.

如果你需要使用Python 2.6-2.7,并且类似文件的对象的性能很重要(它不在这里,但在某些情况下可能会这样),而你只关心CPython,请使用他的答案但cStringIO代替StringIO.(普通StringIO在2.x中io.BytesIO很慢,在3.3之前甚至更慢.)

  • 为我工作,但我必须编码字符串作为BytesIO需要类似字节的对象.所以:`bio = io.BytesIO('text to store'.encode('utf-8'))` (2认同)

Dan*_*ski 6

你有没有用试过StringIO对象,这叫声也像文件,但只是一个字符串?

from ftplib import *
import StringIO

ftp = FTP('ftp.mysite.com')
ftp.login('un','pw')
ftp.cwd('/')
ftp.storbinary('STOR myfile.html', StringIO.StringIO('text to store'))
Run Code Online (Sandbox Code Playgroud)

编辑:@ abarnert的答案是Python3的等价物.我的是Python2版本.