如何使用pysftp将变量中的大型XML字符串写入FTP服务器?
解决pysftp.putfo上传XML字符串时的TypeError问题
嘿,我来帮你搞定这个问题!你遇到的TypeError: Expected unicode or bytes, got ...错误,核心原因是**pysftp.putfo 需要的是二进制类文件对象,但你用的StringIO是文本模式的对象,两者不兼容**。
修复后的可运行代码
from io import BytesIO from pysftp import Connection, CnOpts cnopts = CnOpts() cnopts.hostkeys = None # 注意:这只是测试用的不安全设置,生产环境别这么干! with Connection('localhost', username='admin', password='test', cnopts=cnopts) as sftp: # 把你的XML字符串转成bytes,再用BytesIO包装成二进制类文件对象 xml_str = "你的大型XML内容字符串" # 别忘了指定远程文件路径,不然会传到SFTP服务器的默认目录下 sftp.putfo(BytesIO(xml_str.encode('utf-8')), remotepath="/path/to/your/file.xml")
为什么原来的代码会报错?
StringIO是用来处理Unicode文本的类文件对象,它的读写操作都是基于文本的;- SFTP协议底层是二进制传输,
pysftp.putfo要求传入的对象支持二进制读写(也就是实现了read()方法返回bytes的对象); - 当你传入
StringIO时,pysftp内部读取数据时拿到的是文本而非bytes,自然就触发了类型错误。
生产环境的安全提醒
千万别像示例里那样把hostkeys设为None,这会跳过SFTP的主机密钥验证,容易遭遇中间人攻击。正确的做法是提前加载合法的主机密钥:
cnopts = CnOpts() cnopts.hostkeys.load('/path/to/known_hosts')
内容的提问来源于stack exchange,提问作者Stian
相关产品推荐
相关产品推荐

