2010-09-14 39 views
1

据我所知,不可能用ftp创建一个空文件,你必须在本地驱动器上创建一个空文件,上传它,然后在完成后删除它。我想知道是否有可能做这样的事情:上传空文件到ftp与伪文件

class FakeFile: 
    def read(self): 
     return '\x04' 

ftpinstance.storbinary('stor fe', FakeFile()) 

我想这可能会奏效,因为storbinary文档说,它需要一个对象与方法“读”,并直到它返回EOF调用它, \ x04是ASCII EOF字符。尽管我已经尝试过,并且该文件最终在服务器上是一个随机数大于千字节。我误解了什么吗?

回答

2

文件结尾在现代用法中不是ASCII 4。从XMODEM和电传打字的日子来看,这是过时的用法。试试这个:

class FakeFile: 
    def read(self, size=0): 
     return '' 

因为空的读取是EOF。

使用您当前的代码,您应该得到一个完全由'\x04'字符组成的随机长度文件。这是因为它在读取时似乎总是有数据。^_-

+0

为什么它不能完成上传?它不应该永远上传? – zeta 2010-09-14 01:06:54

+0

我不知道。我认为它也应该如此。 – 2010-09-14 01:10:17

0

实际上文档读取'读取直到EOF'。我通过让read函数返回一个空字符串来解决这个问题。

4

无需实现自己的类文件类,只需使用内存文件从内置模块StringIO(或BytesIO在Python 3):

import ftplib 
import cStringIO 

ftp = ftplib.FTP('ftp.example.com') 
ftp.login('user', 'pass') 

voidfile = cStringIO.StringIO('') 
ftp.storbinary('STOR emptyfile.foo', voidfile) 

ftp.close() 
voidfile.close()