因为一个具体项目的需求,我们需要在SFTP环境下上传下载资料。以前类似的需求是在Windows环境下用CMD调用WinSCP实现的,现在需要使用Pthon,就学习了一下paramiko库的简单使用。
记录一下已经实现的部分:
- 安装paramiko库
- 单文件的上传和下载
- 多文件和目录部分暂时没有实现,以后需要的时候再补充
安装paramiko
因为我们使用的是Anaconda环境,所以安装模块非常简单
conda install paramiko
复制代码
Python代码
paramiko的使用方法比较直观,可以和操作JDBC进行类比。首先获取一个链接,然后使用这个链接对象进行具体的上传下载,最后关闭连接。简单粗暴,非常有效。
获取Connect
import paramiko
import os
# 获取连接
def getConnect(host, port, username, password):
"""
:param host: SFTP ip
:param port: SFTP port
:param username: SFTP userName
:param password: SFTP password
:return: sftp
"""
print("SFTP connection...")
result = [1, ""]
sftp = None
try:
handle = paramiko.Transport((host, port))
handle.connect(username=username, password=password)
sftp = paramiko.SFTPClient.from_transport(handle)
print("connection success")
except Exception as e:
sftp = None
print("connection fail, reason:{0}".format(e))
return sftp
复制代码
upload
这里只实现了简单的使用,把指定的一个文件上传到远端文件夹,如果文件夹不存在就会首先建立对应的文件夹。
# 上传指定文件
def uploadFile(sftp, remoteDir, localPath):
"""
:param sftp:
:param remoteDir: 服务端文件夹路径
:param localPath: 客户端文件路径
:return:
"""
print("start upload file by use SFTP...")
result = [1, ""]
try:
# 是否需要建立目录
try:
sftp.chdir(remoteDir)
except:
sftp.mkdir(remoteDir)
fileName = os.path.basename(localPath)
remotePath = '{0}{1}'.format(remoteDir, fileName)
sftp.put(localPath, remotePath)
result = [1, "upload " + fileName + " success"]
except Exception as e:
result = [-1, "upload fail, reason:{0}".format(e)]
print(result[1])
return result
复制代码
download
同样是简单使用,把服务器上的一个文件下载到本地文件夹中。
# 下载文件
def downloadFile(sftp, remotePath, localAbsDir):
"""
:param handle:
:param remotePath: 服务端文件路径
:param localAbsDir: 客户端文件夹的路径
:return:
"""
print("start download file by use SFTP...")
result = [1, ""]
try:
fileName = os.path.basename(remotePath)
localAbsPath = '{0}{1}'.format(localAbsDir, fileName)
lad = os.path.split(localAbsPath)[0]
if not os.path.exists(lad):
os.makedirs(lad)
sftp.get(remotePath, localAbsPath)
result = [1, "download " + localAbsPath + " success"]
except Exception as e:
result = [-1, "download fail, reason:{0}".format(e)]
print(result[1])
return result
复制代码
测试代码
if __name__ == "__main__":
sftp = getConnect(
host='192.168.1.57',
port=22,
username='user',
password='123456'
)
uploadFile(sftp, '/home/etl/upload/dl_zhihui/out_01/', './sample_upload.txt')
downloadFile(sftp, '/home/etl/upload/dl_zhihui/cfg_01/sample_download.txt', './')
sftp.close()
复制代码
SFTP connection...
connection success
start download file by use SFTP...
download ./sample_download.txt success
复制代码