项目背景
之前项目中经常使用paramiko模块SFTP下载远端文件到本地,再读取本地文件进行相关操作后入库,最终再删除该本地文件。
思考优化
但是最近开始思考到,其实很多情况下是不需要保留SFTP下载到本地的文件的,只需一次性使用其中的数据而已。
查看了一下paramiko模块的API,paramiko
模块中下载数据的方法SFTPClient
类有get
和getfo
两种。前者则是我常用的下载文件到本地的方法,后者是将文件一次读取为数据流再写入到文件对象的方法。但都不符合我的预期要求。
我希望能安全的读取SFTP远端文件的数据对象到内存中使用,便有了这次尝试。既然要安全的读取远端文件,便不能把文件内容一次全部加载到内存,这里就需要考虑使用生成器。
代码实现
我的整体测试代码如下,借助sftp的open方法,实现一个按行读取远端大文件的生成器方法。
import paramiko
class SftpTest(object):
def __init__(self):
self.host = 'Your sftp host'
self.port = 22
self.username = 'Your username'
self.password = 'Your password'
self.ssh = None
self.sftp = None
self.connect()
def __get_ssh(self):
try:
self.ssh = paramiko.Transport