如何使用 pysftp 将字符串写入 ftp 上的文件?
How to write a string to file on ftp with pysftp?
我有一个很大的 xml 文件存储在一个变量中。我想使用 pysftp 将它直接写入 ftp。
我相信我需要使用 pysftp.putfo 并且这需要一个类似对象的文件。这是一个最小的例子:
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 上的文件的目标?
我找到了一种解决方案,但不确定它是不是最好的:
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()。
您的第一种方法有效,只需指定一个文件名即可。内存文件没有默认名称,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上传还是从内存上传是完全透明的。
我有一个很大的 xml 文件存储在一个变量中。我想使用 pysftp 将它直接写入 ftp。 我相信我需要使用 pysftp.putfo 并且这需要一个类似对象的文件。这是一个最小的例子:
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 上的文件的目标?
我找到了一种解决方案,但不确定它是不是最好的:
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()。
您的第一种方法有效,只需指定一个文件名即可。内存文件没有默认名称,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上传还是从内存上传是完全透明的。