如何用pysftp在ftp上写一个字符串文件?

时间:2018-04-20 09:00:45

标签: python stringio pysftp

我有一个存储在变量中的大型xml文件。我想用pysftp将它直接写入ftp。 我相信我需要使用pysftp.putfo,这需要一个像object这样的文件。这是一个最小的例子:

from io import StringIO
from pysftp import Connection, CnOpts

cnopts = CnOpts()
cnopts.hostkeys = None
with Connection('localhost'
                    ,username= 'admin'
                    ,password = 'test'
                    ,cnopts=cnopts
                    ) as sftp:
        sftp.putfo(StringIO('xml string'))

我收到以下错误:

TypeError: Expected unicode or bytes, got None

我做错了什么?是否有更简单,更好的方法来实现我的目标,即将字符串变量写入ftp上的文件?

2 个答案:

答案 0 :(得分:2)

您的第一种方法是有效的,只需指定文件名即可。内存文件没有默认名称,并且pysftp不知道如何命名目标文件。

from io import StringIO
from pysftp import Connection

with Connection('localhost', ...) as sftp:
    sftp.putfo(StringIO('xml string'), 'test.txt') 

它应该可以正常工作。另外,作为旁注-Paramiko(pysftml使用的库)put操作在调用putfo的幕后,它只是一个薄包装。因此,从服务器的角度来看,直接从FS还是从内存上传文件完全透明。

答案 1 :(得分:1)

我找到了一个解决方案,不确定是最好的:

from io import StringIO
from pysftp import Connection, CnOpts

cnopts = CnOpts()
cnopts.hostkeys = None
with Connection('localhost'
                ,username= 'admin'
                ,password = 'test'
                ,cnopts=cnopts
                ) as sftp:

    f = sftp.open('/folder/filename.xml', 'wb')
    f.write('xml string')

编辑:发现为什么没有这方面的好解决方案。大多数FTP服务器都会要求您直接放置文件,这可能是为了避免不受欢迎的流。所以我的最终解决方案是在本地创建文件并使用pysft put()。