当前位置:首页>python>利用python实现sftp文件的上传和下载

利用python实现sftp文件的上传和下载

  • 2026-10-11 06:58:28
利用python实现sftp文件的上传和下载

本文主要介绍如何使用python的paramiko模块连接sftp服务器,并实现sftp文件及目录的上传和下载。

01 演示环境

实现功能: 利用python自动连接sftp,并实现本地文件(文件夹)自动上传到远程sftp服务中指定路径下,且保持本地目录结构;或者从sftp服务器中下载指定目录及文件。

系统环境:centos7

python版本:python3 

使用模块包:paramiko ,若未安装,可使用 pip install  paramiko 进行安装

02 难点分析
  • (1)sftp.put(localfile,remotefile) 函数必须是两个文件名,且sftp远端的文件路径要存在,因此需要提前创建好目录

  • (2)sftp.mkdir() 函数只能创建一级目录,不能循环创建多级目录,本文通过一级一级获取本地路径,然后判断远程路径是否存在,若不存在就创建好,由此来保证上传的文件能够在sftp远端找到对应的目录

  • (3)用到的重点函数有 sftp.mkdir 、sftp.stat,更多函数可参见帮助文档:https://docs.paramiko.org/en/stable/api/sftp.html

03 将文件上传到sftp服务器中
# -*- coding: utf-8 -*-import paramikoimport osimport stat# 判断sftp服务端中文件路径是否存在,若不存在则创建def create_dir(sftp,remoteDir):    try:        if stat.S_ISDIR(sftp.stat(remoteDir).st_mode): # 如果remoteDir存在且为目录,则返回True            pass    except Exception as e:        sftp.mkdir(remoteDir)        print("在远程sftp上创建目录:{}".format(remoteDir))# 上传def sftp_upload(sftp,localDir,remoteDir):    if os.path.isdir(localDir): # 判断本地localDir是否为目录        for file in os.listdir(localDir):            remoteDirTmp=os.path.join(remoteDir,file)            localDirTmp=os.path.join(localDir,file)            if os.path.isdir(localDirTmp): # 如果本地localDirTmp为目录,则对远程sftp服务器进行判断                create_dir(sftp,remoteDirTmp) # 判断sftp服务端文件目录是否存在,若不存在则创建            sftp_upload(sftp,localDirTmp,remoteDirTmp)    else:        print("upload file:",localDir)        try:            sftp.put(localDir,remoteDir)        except Exception as e:            print('upload error:',e)if __name__ == '__main__':    host = '192.168.149.153'#sftp主机     port = 22 #端口    username = 'sftpuser' #sftp用户名    password = 'passwd'  # 密码    localDir = '/test/sftp'#本地文件或目录    remoteDir = '/sftp'#远程文件或目录(注意远程路径要存在)    sf = paramiko.Transport((host,port))    sf.connect(username = username,password = password)    sftp = paramiko.SFTPClient.from_transport(sf)    sftp_upload(sftp,localDir,remoteDir)    sf.close()
04 下载sftp中的文件

sftp服务中的文件如下:

将sftp根目录中的所有文件下载到本地 /data/test  目录中

实现代码
#!/usr/bin/python# coding=utf-8import paramikoimport osimport statdef sftp_download(sftp,localDir,remoteDir):    if stat.S_ISDIR(sftp.stat(remoteDir).st_mode): # 如果sftp服务端的remoterDir是目录,则返回True        for file in sftp.listdir(remoteDir):            remoteDirTmp=os.path.join(remoteDir,file)            localDirTmp=os.path.join(localDir,file)            sftp_download(sftp,localDirTmp,remoteDirTmp)    else:        localPath=localDir.rpartition("/")[0]        if not os.path.exists(localPath): # 如果本地目录不存在,则创建            os.makedirs(localPath)  # 可创建多级目录        print("download file:",remoteDir)        try:            sftp.get(remoteDir,localDir)        except Exception as e:            print('download exception:',e)if __name__ == '__main__':    host = '192.168.149.128'#sftp主机     port = 22 #端口    username = 'sftp' #sftp用户名    password = '123456'      localDir = '/data/test'#本地文件或目录    remoteDir = '/'#远程文件或目录    sf = paramiko.Transport((host,port))    sf.connect(username = username,password = password)    sftp = paramiko.SFTPClient.from_transport(sf)    sftp_download(sftp,localDir,remoteDir)    sf.close()

如果本文对你有帮助,欢迎 “点赞”、“分享”、“推荐”,也欢迎在评论区互动,感谢!
点关注,一起成长!

深耕技术是提升收入的底气,打理资产是守住收入的底气。我的小号【小韭菜的慢富笔记】,专注打工人稳健攒股收息、价值投资实战,不追热点、不玩投机,只分享普通人可复制的慢富思路。感兴趣的朋友,欢迎关注交流,一起慢慢变富~

最新文章

随机文章