Python 使用SFTP和FTP实现对服务器的文件下载功能


Posted in Python onDecember 17, 2020

一、用 ftplib 模块连接远程服务器

ftplib模块常用方法

ftp登陆连接
from ftplib import FTP  #加载ftp模块
ftp=FTP()    #设置变量
ftp.set_debuglevel(2)  #打开调试级别2,显示详细信息
ftp.connect("IP","port")  #连接的ftp sever和端口
ftp.login("user","password") #连接的用户名,密码
print ftp.getwelcome()  #打印出欢迎信息
ftp.cmd("xxx/xxx")  #进入远程目录
bufsize=1024   #设置的缓冲区大小
filename="filename.txt"  #需要下载的文件
file_handle=open(filename,"wb").write #以写模式在本地打开文件
ftp.retrbinaly("RETR filename.txt",file_handle,bufsize) #接收服务器上文件并写入本地文件
ftp.set_debuglevel(0)  #关闭调试模式
ftp.quit()   #退出ftp
 
ftp相关命令操作
ftp.cwd(pathname)   #设置FTP当前操作的路径
ftp.dir()    #显示目录下所有目录信息
ftp.nlst()   #获取目录下的文件
ftp.mkd(pathname)   #新建远程目录
ftp.pwd()    #返回当前所在位置
ftp.rmd(dirname)   #删除远程目录
ftp.delete(filename)  #删除远程文件
ftp.rename(fromname, toname)#将fromname修改名称为toname。
ftp.storbinaly("STOR filename.txt",file_handel,bufsize) #上传目标文件
ftp.retrbinary("RETR filename.txt",file_handel,bufsize) #下载FTP文件

ftplib模块封装调用

from ftplib import FTP
from common.logModule import LogClass


class FTPClass(LogClass):
 """
 :FTP连接远程服务器下载文件
 """

 def __init__(self, ftp_link, ftp_path=None):
 """
 :连接ftp服务器
 :param ftp_link: 服务器ip, 用户名, 密码
 :param ftp_path: ftp中的文件路径
 """
 LogClass.__init__(self, logName='FTPClass')
 self.ftp = FTP(ftp_link[0]) # 链接FTP
 self.ftp.set_debuglevel(2) # 设置调试等级
 self.ftp.login(ftp_link[1], ftp_link[2]) # 输入用户名和密码
 self.ftp.set_pasv(False) # False:主动模式 True:被动模式
 if ftp_path:
  self.ftp.cwd(ftp_path)

 def download_file(self, like_file_name, save_path, save_name=None):
 """
 :下载文件并保存文件到本地,如果save_name为空则下载所有文件名称包含like_file_name的所有文件
 :param like_file_name: 需要下载的文件
 :param save_path : 文件保存路径
 :param save_name: 文件保存名称
 :return:
 """
 try:
  ftp_files = self.ftp.nlst() # 获取ftp当前目录下的所有文件名称
  if save_name: # 如果文件保存名称存在则只下载单一文件
  fp = open(save_path + save_name, 'wb') # 以写模式在本地打开文件
  self.ftp.retrbinary('RETR ' + 'ftp文件名', fp.write) # 接收服务器上文件并写入本地文件
  fp.close() # 关闭文件
  else: # 如果文件保存名称则下载包含like_file_name的所有文件
  for ftp_file in ftp_files:
   if ftp_file[-5:] == '.GRB2':
   if like_file_name in ftp_file: # 如果文件名称中包含like_file_name
    fp = open(save_path + ftp_file, 'wb') # 以写模式在本地打开文件
    self.ftp.retrbinary('RETR ' + ftp_file, fp.write) # 接收服务器上文件并写入本地文件
    fp.close() # 关闭文件
  self.ftp.quit() # 关闭ftp 连接
 except Exception:
  raise
if __name__ == '__main__':
 ftp_link = ['ip', 'username', 'password']
 ftp_path = '/data/result/'
 ftp = FTPClass(ftp_link, ftp_path)
 like_file_name = ".GRB2"
 save_path = 'D:\\file\\'
 ftp.download_file(like_file_name, save_path)

用 paramiko 模块连接远程服务器

paramiko 模块常用方法

put(self,localpath,remotepath,callback=None,confirm=True)
	参数说明:
		localpath:上传源文件的本地路径
		remotepath:目标路径
		callback:获取接收与总传输字节数
		confirm:上传完毕后是否调用stat()方法,以便确认文件大小
get(self, remotepath, localpath, callback=None)
	参数说明:
		remotepath:需要下载的远程文件
		localpath:本地存储路径
		callback:同put方法
mkdir:用于创建目录
remove:删除目录
rename:重命名
stat:获取文件信息
listdir:获取目录列表

paramiko模块封装调用

import os
import paramiko
from stat import S_ISDIR
from common.logModule import LogClass
class SFTPClass(LogClass):
 """
 :SFTP连接远程服务器下载文件
 """

 def __init__(self, ftp_link, ftp_path=None, local_path=None):
 """
 连接ftp服务器
 """
 LogClass.__init__(self, logName='FTPProcess')
 trans = paramiko.Transport((ftp_link[0], 22)) # 连接 ftp
 trans.connect(username=ftp_link[1], password=ftp_link[2]) # 输入用户名和密码
 self.sftp = paramiko.SFTPClient.from_transport(trans)
 self.ftp_path = ftp_path # 目标路径
 self.local_path = local_path # 保存路径

 def save_all_file_path(self, ftp_path):
 """保存所有文件的列表"""
 all_files = list()
 if ftp_path[-1] == '/': # 去掉路径字符串最后的字符'/',如果有的话
  ftp_path = ftp_path[0:-1]
 files = self.sftp.listdir_attr(ftp_path) # 获取当前指定目录下的所有目录及文件,包含属性值
 for i in files:
  filename = ftp_path + '/' + i.filename
  if S_ISDIR(i.st_mode): # 如果是目录,则递归处理该目录,这里用到了stat库中的S_ISDIR方法
  all_files.extend(self.save_all_file_path(filename))
  else:
  all_files.append(filename)
 return all_files

 def download_file(self):
 """
 下载文件并保存文件到本地
 """
 try:
  if self.ftp_path and self.local_path:
  all_files = self.save_all_file_path(self.ftp_path) # 保存所有文件的列表
  for file in all_files:
   filename = file.split('/')[-1]
   local_filename = os.path.join(self.local_path, filename)
   self.logger.info(u'During file download: %s' % filename)
   self.sftp.get(file, local_filename) # 下载到本地
  else:
  self.logger.error("ftp_path or local_path is null")
  return
 except Exception as e:
  self.logger.error(e)
if __name__ == '__main__':
 ftp_link = ['ip', 'user', 'password']
 ftp_path = "/data/"
 local_path = "D:\\file\\"
 f = SFTPClass(ftp_link, ftp_path=None, local_path=None)
 f.download_file()

到此这篇关于Python 使用SFTP和FTP实现对服务器的文件下载功能的文章就介绍到这了,更多相关Python 实现服务器文件下载内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
利用python发送和接收邮件
Sep 27 Python
Python脚本实现Web漏洞扫描工具
Oct 25 Python
不可错过的十本Python好书
Jul 06 Python
Python使用xlwt模块操作Excel的方法详解
Mar 27 Python
python实现随机调用一个浏览器打开网页
Apr 21 Python
Python os.rename() 重命名目录和文件的示例
Oct 25 Python
关于Pycharm无法debug问题的总结
Jan 19 Python
Python异步操作MySQL示例【使用aiomysql】
May 16 Python
django admin组件使用方法详解
Jul 19 Python
python数据预处理 :样本分布不均的解决(过采样和欠采样)
Feb 29 Python
django 利用Q对象与F对象进行查询的实现
May 15 Python
python批量修改交换机密码的示例
Sep 22 Python
python爬虫利器之requests库的用法(超全面的爬取网页案例)
Dec 17 #Python
python使用smtplib模块发送邮件
Dec 17 #Python
python实现计算器简易版
Dec 17 #Python
利用Python实现自动扫雷小脚本
Dec 17 #Python
用python读取xlsx文件
Dec 17 #Python
Python实现自动整理文件的脚本
Dec 17 #Python
Python用access判断文件是否被占用的实例方法
Dec 17 #Python
You might like
全国FM电台频率大全 - 11 浙江省
2020/03/11 无线电
德生S2000收音机更换“钕铁硼”全频扬声器
2021/03/02 无线电
很让人受教的 提高php代码质量36计
2012/09/05 PHP
PHP长连接实现与使用方法详解
2018/02/11 PHP
PHP Pipeline 实现中间件的示例代码
2020/04/26 PHP
jquery怎样实现ajax联动框(一)
2013/03/08 Javascript
JavaScript表达式:URL 协议介绍
2013/03/10 Javascript
jquery如何把参数列严格转换成数组实现思路
2013/04/01 Javascript
客户端js判断文件类型和文件大小即限制上传大小
2013/11/20 Javascript
NodeJS学习笔记之Connect中间件模块(二)
2015/01/27 NodeJs
JS组件Bootstrap Table使用实例分享
2016/05/30 Javascript
js倒计时显示实例
2016/12/11 Javascript
Bootstrap面板学习使用
2017/02/09 Javascript
ES6中class类用法实例浅析
2017/04/06 Javascript
Validform验证时可以为空否则按照指定格式验证
2017/10/20 Javascript
JavaScript基础心法 深浅拷贝(浅拷贝和深拷贝)
2018/03/05 Javascript
在vue项目中集成graphql(vue-ApolloClient)
2018/09/08 Javascript
JavaScript中构造函数与原型链之间的关系详解
2019/02/25 Javascript
详解es6新增数组方法简便了哪些操作
2019/05/09 Javascript
[36:43]NB vs Optic 2018国际邀请赛小组赛BO1 B组加赛 8.19
2018/08/21 DOTA
[01:32]TI珍贵瞬间系列(一)
2020/08/26 DOTA
[01:05:52]DOTA2-DPC中国联赛 正赛 Ehome vs Aster BO3 第一场 2月2日
2021/03/11 DOTA
python在Windows8下获取本机ip地址的方法
2015/03/14 Python
在Python3中初学者应会的一些基本的提升效率的小技巧
2015/03/31 Python
Python3的介绍、安装和命令行的认识(推荐)
2018/10/20 Python
python爬虫爬取幽默笑话网站
2019/10/24 Python
pyhton中__pycache__文件夹的产生与作用详解
2019/11/24 Python
Django CBV模型源码运行流程详解
2020/08/17 Python
python 使用openpyxl读取excel数据
2021/02/18 Python
护校行动方案
2014/05/31 职场文书
企业人事任命书
2014/06/05 职场文书
英语三分钟演讲稿
2014/08/19 职场文书
贫困证明怎么写
2015/06/16 职场文书
Python 游戏大作炫酷机甲闯关游戏爆肝数千行代码实现案例进阶
2021/10/16 Python
利用uni-app生成微信小程序的踩坑记录
2022/04/05 Javascript
《金肉人》米特&《航海王》阿鹤声优松岛实因胰脏癌去世 享寿81岁
2022/04/13 日漫